1. 程式人生 > >設計模式-建立型軟體設計模式(一)

設計模式-建立型軟體設計模式(一)

主要介紹下面的三個設計模式:
(1)工廠模式與抽象工廠模式
(2)生成器模式
(3)單例模式

工廠模式

工廠模式可以分為簡單工廠模式,工廠模式以及抽象工廠模式。

簡單工廠模式

簡單工廠模式的特點是僅僅有一個具體的建立者類,並且此類中包含一個靜態的工廠方法factory().

首先定義一個介面
public interface food
{
    abstract String getInsurInfo();
}
public class apple implements food
{
    ....
    public String getInsurInfo();
}
public class meat implements food
{
    ...
    public String getInsurInfo();
}

工廠類:
public class factory
{
    public static food getInstance(String value)
    {
        food x = null;
        if(value.compareTo("apple")==0)
        {x=new apple();}
        else if(value.compareTo("meat")==0)
        {x=new meat();}
        return x;
    }
}

優點:
①工廠方法包含從一個類的結構中選擇初始類的業務邏輯。
②客戶類不直接建立產品類的物件,客戶類只作為物件額消費者。、
③實現了責任分離。
④客戶類不負有建立類的物件的責任,因此如果有新產品子類加入,不必修改已有的客戶類程式碼(客戶類暫時不使用新加的子類)。
⑤免除了客戶類在建立類時的邏輯判斷。
缺點:
①不符合開閉原則,每當增加產品類的時候,都需要修改工廠類的程式碼。
②因為工廠類的工廠方法是靜態的,所有工廠類的方法不能被繼承,簡單工廠類只能是一個單獨的類,而不能成為一個層次的類。

工廠方法模式

導致簡單工廠方法模式不符合開閉原則的原因是工廠方法類只是一個實類,每當有一個新的產品類被加入到產品類當中,在工廠方法類中就必須增加適當的條件語句。所以在此基礎上,我們可以將簡單工廠方法模式中的單一工廠類改寫為一個層次類來解決這個問題。

工廠類:
public interface factory()
{
    public food getInstance();
}

public class appleFactory implements factory
{
    public food getInstance(){return new food();}
}

public class meatFactory implements factory
{
    public food getInstance(){return new meat();}
}

工廠模式與簡單工廠模式的區別:
①工廠方法模式的中心是抽象工廠類或者介面,而簡單工廠方法模式的中心是一個實的工廠類。並且在簡單工廠模式中,工廠方法是靜態的,而工廠模式中,方式是動態的。
②簡單工廠模式不符合開閉原則,工廠模式符合開閉原則。
③簡單工廠模式中,必要的建立物件的邏輯判斷包含在工廠類中。在工廠模式中,工廠類不必包含建立物件的邏輯判斷。
工廠模式的優點:
①將建立物件的邏輯與任務交給了工廠類。
②工廠方法模式支援開閉原則。

抽象工廠模式

抽象工廠模式與工廠方法模式有相似的概念,抽象工廠方法模式和工廠模式一樣是層次類的結構,但是在這裡他不僅僅負責建立一個產品類的物件,而是建立一族產品類的物件。
抽象工廠模式包括:
①一系列互相有關聯的產品類,這些產品類有相同的結構。
②一系列實的工廠類,實現由抽象工廠類提供的介面。每個實的工廠類生產一組相關的產品類的物件。

public interface food
{
    abstract String getInsurInfo();
}
public class apple implements food
{
    ....
    public String getInsurInfo();
}

public interface food2
{
    abstract String getInsurInfo();
}
public class apple2 implements food2
{
    ....
    public String getInsurInfo();
}

工廠類:
public abstract class factory
{
    public static final String food= "food";
    public static final String food2= "food2";
    public abstract food getFood();
    public abstract food2 getFood2();
    public static getInstrance(String type)
    {
        factory f = null;
        if(type.equals(factory.food)){f=new foodfactory();}
        else if(type.equals(factory.food2)){f=new food2factory();}
        return f;
    }
}
public class foodfactory extends factory
{
    public food getFood()
    {return new apple();}
    public food2 getFood2()
    {return new apple2();}
}
public class food2factory extends factory
{
    public food getFood()
    {return new apple();}
    public food2 getFood2()
    {return new apple2();}
}