工廠方法模式與抽象工廠模式

2021-07-30 16:40:26 字數 2219 閱讀 7626

這篇部落格主要記錄一下工廠方法模式和抽象工廠模式。

工廠方法模式比較常見,且相對比較容易理解,

因此直接介紹一下它的定義及設計結構。

工廠方法模式定義了乙個建立物件的介面,

但由子類決定例項化的類是哪乙個。

工廠方法讓類把例項化推遲到子類。

如圖所示,抽象的creator提供了乙個建立物件的介面factorymethod。

在抽象的creator中,任何其它的方法,例如anoperation,都可能使用到factorymethod製造出的產品product。

但product的具體型別,由creator的子類concretecreator來決定。

concretecreator負責建立乙個或多個具體產品。

所有的產品都必須實現共同的介面product(設計模式中的介面,包括抽象類和通常意義的介面)。

這樣,使用產品的類就可以引用product介面,而不是具體的類。

使用工廠方法模式的好處是,將產品的「實現」與「使用」解耦。

如果增加產品或者改變產品的實現,使用creator的客戶端**不會受到影響。

以head first中的場景為例:

pizzastore是建立pizza的抽象父類,pizza是實際產品的抽象父類。

nypizzastore和chicagopizzatore是實際建立pizza的類,

可以分別建立出nystylecheesepizza和chicagostylecheesepizza。

在這種設計結構下,可以寫出類似如下的**:

...

......

...pizzastore nystore =

new nypizzastore();

pizzastore chicagostore =

new chicagopizzastore();

pizza nypizza = nystore.createpizza();

pizza chicagopizza = chicagostore.createpizza();

......

......

使用者只需要知道最後得到的是pizza類,

並不需要知道nypizzastore和chicagopizzastore建立pizza的細節,

以及pizza的實際型別。

這就為未來的變化,留有很大的餘地。

在了解工廠方法模式後,我們再來看看抽象工廠模式。

抽象工廠模式提供乙個介面,用於建立相關或依賴物件的家族,

而不需要明確指定具體類。

如上圖所示,客戶端client只需要和抽象的工廠abstractfactory打交道,

得到抽象的產品abstractproducta和abstractproductb。

客戶不需要知道實際產出的具體產品是什麼,

這就到達了將客戶從具體的產品中解耦的目的。

抽象工廠abstractfactory定義了一組介面,用於建立一系列相關的產品族。

所有具體的工廠都必須實現abstractfactory中定義的介面,以生產實際的產品。

例如,圖中的一族產品包括producta和productb。

concretefactory1和concretefactory2均具有生產整個產品族的能力。

從上圖可以看出,abstractfactory仍然將建立具體物件的任務延遲到其子類完成,

由此可以得到,抽象工廠模式實際上也應用了工廠方法模式。

在文章的最後,做一下總結:

工廠方法模式,其實就是通過子類來建立物件。

用這種做法,客戶只需要知道他們所使用的抽象型別就可以了,

而由工廠的子類來負責決定具體的型別。

抽象工廠模式,主要提供用來建立整個產品家族的抽象型別。

這個型別的子類定義了產品族中每個產品的生產方法。

工廠方法模式與抽象工廠模式

工廠方法 public inte ce product public inte ce creator public class concreteproduct1 implements product public class concreteproduct2 implements product p...

抽象工廠與工廠方法模式

1.如果乙個後花園只種蔬菜類,那麼就用簡單工廠就可以了.2.如果後花園蔬菜品種繁多.得用工廠方法才可以,把共有的東西抽象出來.3.如果要擴大後花園的規模,比如乙個在北方,乙個在南方,這樣工廠方法就無法實現了,就應當用抽象工廠,把各種各樣的植物,又組成乙個後花園.簡單工廠是乙個工廠只生產一類的產品,面...

抽象工廠模式(工廠方法模式)

工廠方法模式是在簡單工廠模式的基礎之上將建立具體產品類的工廠進一步抽象,使產品的建立不依賴具體的工廠,只需要依賴抽象工廠,後續如果要新增新的產品和工廠,只需要實現該抽象工廠的介面即可。建立抽象工廠和產品 public inte ce productfactory public inte ce pro...