設計模式之原型模式

定義:定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類

不同子類可能會有不同的實現,不同的代碼,在不修改已存在類情況下,去擴展已有類的方法,並且實例化的過程延遲到客戶端代碼執行過程中,即多態。。

才規矩,上個例子,依然來自《大話設計模式》

首先是一個類,可以認爲是已存在的不可修改的類,可能來自網絡/文本/jar包等等

public class LeiFeng
{
    public void sweep()
    {
        System.out.println("掃地");
    }

    public void wash()
    {
        System.out.println("洗衣");
    }
}

一種實現,這裏是學生學 LeiFeng 做好事

public class Undergraduate extends LeiFeng
{

    @Override
    public void sweep()
    {
        System.out.println("undergraduate sweep");
    }

    @Override
    public void wash()
    {
        System.out.println("undergraduate wash");
    }

}

另一種實現,這裏是志願者學 LeiFeng 做好事

public class Volunteer extends LeiFeng
{
    @Override
    public void sweep()
    {
        System.out.println("volunteer sweep");
    }

    @Override
    public void wash()
    {
        System.out.println("volunteer wash");
    }
}

工廠方法,創建一個 LeiFeng

public interface IFactory
{
    LeiFeng createLeiFeng();
}

創建哪個 LeiFeng,這裏創建學生

public class UndergraduateFactory implements IFactory
{

    public LeiFeng createLeiFeng()
    {
        return new Undergraduate();
    }

}

創建哪個 LeiFeng ,這裏創建志願者

public class VolunteerFactory implements IFactory
{

    public LeiFeng createLeiFeng()
    {
        return new Volunteer();
    }

}

客戶端代碼,可以修改factory, 的實現,如factory = new UndergraduateFacotry(), 就可以創建一個學生 LeiFeng ,這樣不需要修改已有代碼,如果來一個男 LeiFeng,只需要加 Male繼承LeiFeng,MaleFactory 實現 IFactory 創建方法即可

public class FactoryMain
{
    public static void main(String[] args)
    {
        IFactory factory = new VolunteerFactory();
        LeiFeng student = factory.createLeiFeng();

        student.wash();
        student.sweep();
    }
}

總結

將創建具體對象延遲到客戶端調用時,這樣工廠類中就不需要加業務代碼。

發佈了106 篇原創文章 · 獲贊 49 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章