設計模式 建立型 工廠方法模式

2021-07-14 18:12:49 字數 3104 閱讀 7734

建立性模式有五種:

1.工廠模式

①簡單工廠模式(經常被用到,不屬於gof23種設計模式)

②工廠方法模式

③抽象工廠模式

2.建造者模式

3.原型模式

4.單例模式

工廠方法(factory method)模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。

抽象工廠(creator)角色:是工廠方法模式的核心,與應用程式無關。任何在模式中建立的物件的工廠類必須實現這個介面。

具體工廠(concrete creator)角色:這是實現抽象工廠介面的具體工廠類,包含與應用程式密切相關的邏輯,並且受到應用程式呼叫以建立產品物件。在上圖中有兩個這樣的角色:bulbcreator與tubecreator。

抽象產品(product)角色:工廠方法模式所建立的物件的超型別,也就是產品物件的共同父類或共同擁有的介面。在上圖中,這個角色是light。

具體產品(concrete product)角色:這個角色實現了抽象產品角色所定義的介面。某具體產品有專門的具體工廠建立,它們之間往往一一對應。

優點:

1、  在工廠方法中,使用者只需要知道所要產品的具體工廠,無須關係具體的建立過程,甚至不需要具體產品類的類名。

2、  在系統增加新的產品時,我們只需要新增乙個具體產品類和對應的實現工廠,無需對原工廠進行任何修改,很好地符合了「開閉原則」。

缺點:

1、  每次增加乙個產品時,都需要增加乙個具體類和物件實現工廠,是的系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。

/** * 工廠抽象類

* @author work

* */

public inte***ce ifactory

package com.sun.factory;

/** * 抽象產品角色

* @author work

* */

public abstract class operaction

public void setnumbera(double numbera)

public double getnumberb()

public void setnumberb(double numberb)

}

package com.sun.factory;

/** * 具體工廠加法

* @author work

* */

public class addfactory implements ifactory

}

package com.sun.factory;

/** * 具體產品加

* @author work

* */

public class addoperaction extends operaction

}

package com.sun.factory;

/** * 具體工廠減法

* @author work

* */

public class multfactory implements ifactory

}

package com.sun.factory;

/** * 具體產品減法

* @author work

* */

public class multoperaction extends operaction

}

public class operactionsource 

return factory.createoperaction();

}public static void main(string args)

}

這就是工廠方法模式的典型**實現。這樣當我們新增一種 operaction的時候,只需要新增乙個實現ifactory介面的 factory 類即可。所以,工廠方法模式比起簡單工廠模式更加符合開閉原則。從上面的工廠方法的實現來看起來一切都很完美,但是實際上存在很大問題。問題存在於這些工廠類的使用上,和簡單工廠的**版本非常相似,引入工廠方法非但沒有解決問題,反倒讓設計變得更加複雜了,我們可以為工廠類再建立乙個簡單工廠,也就是工廠的工廠,用來建立工廠類物件
public class operactionmap 

public static ifactory getoperactionfactory(string oper)

ifactory factory = map.get(oper);

return factory;

}public static void main(string args)

}

我們只需要建立新的operaction類和operactionfactory 類,將新的operactionfactory 物件新增到 map中即可。**的改動非常少,基本上符合開閉原則。

當物件的建立邏輯比較複雜,不只是簡單的new一下就可以,而是要組合其他類物件,做各種初始化操作的時候,我們推薦使用工廠方法模式,將複雜的建立邏輯拆分到多個工廠類中,讓每個工廠類都不至於過於複雜。而使用簡單工廠模式,將所有的建立邏輯都放到乙個工廠類中,會導致這個工廠類變得很複雜,**可讀性差,維護困難。除此之外,如果工廠要返回多種不同的物件,為了避免大量的switch-case(或者if-else)邏輯判斷我們也建議使用工廠方法模式

如果物件的建立邏輯簡單則推薦使用簡單工廠

建立型設計模式 工廠方法模式

工廠方法模式解決的是,不像簡單工廠似的,要增加產品必須改工廠類的 實現思路是,1.抽象工廠類 2.抽象產品類 3.具體工廠類 繼承抽象工廠類 4.具體產品類 繼承抽象產品類 5.外界呼叫。1.抽象工廠類 建立抽象工廠類 abstract class factory2.抽象產品類 建立抽象產品類 ab...

設計模式 建立型 工廠方法模式 多個工廠方法模式

多個工廠方法模式,屬於工廠方法模式中的一種。它是一種建立型模式。是對普通簡單工廠模式的改進,在普通工廠方法模式中,如果傳遞的字串出錯,則不能正確建立物件,而多個工廠方法模式是提供多個工廠方法,分別建立物件.public class gunfactory public igun getgunm4a1 ...

建立型設計模式(3) 工廠方法模式

動機 建立乙個物件往往需要複雜的過程,所以不適合包含在乙個復合工廠中,當有新的產品時,需要修改這個復合的工廠,不利於擴充套件。而且,有些物件的建立可以需要用到復合工廠訪問不到的資訊,所以,定義乙個工廠介面,通過實現這個介面來決定例項化那個產品,這就是工廠方法模式,讓類的例項化推遲到子類中進行。目的 ...