前面介紹的工廠方法模式中考慮的是一類產品的生產,如畜牧場只養動物、電視機廠只生產電視機、計算機軟體學院只培養計算機軟體專業的學生等。
同種類稱為同等級,也就是說:工廠方法模式只考慮生產同等級的產品,但是在現實生活中許多任務廠是綜合型的工廠,能生產多等級(種類) 的產品,如農場裡既養動物又種植物,電器廠既生產電視機又生產洗衣機或空調,大學既有軟體專業又有生物專業等。
抽象工廠(abstractfactory)模式的定義:是一種為訪問類提供乙個建立一組相關或相互依賴物件的介面,且訪問類無須指定所要產品的具體類就能得到同族的不同等級的產品的模式結構。
抽象工廠模式是工廠方法模式的公升級版本,工廠方法模式只生產乙個等級的產品,而抽象工廠模式可生產多個等級的產品。
使用抽象工廠模式一般要滿足以下條件。
抽象工廠模式除了具有工廠方法模式的優點外,其他主要優點如下。
其缺點是:當產品族中需要增加乙個新的產品時,所有的工廠類都需要進行修改。
模式組成
組成(角色)
關係作用
抽象產品族(abstractproduct)
抽象產品的父類
描述抽象產品的公共介面
抽象產品(product)
具體產品的父類
描述具體產品的公共介面
具體產品(concrete product)
抽象產品的子類;工廠類建立的目標類
描述生產的具體產品
抽象工廠(creator)
具體工廠的父類
描述具體工廠的公共介面
具體工廠(concrete creator)
抽象工廠的子類;被外界呼叫
描述具體工廠;實現factorymethod工廠方法建立產品的例項
使用步驟
步驟1:建立抽象工廠類,定義具體工廠的公共介面;
步驟2:建立抽象產品族類,定義抽象產品的公共介面;
步驟3:建立抽象產品類(繼承抽象產品族類),定義具體產品的公共介面;
步驟4:建立具體產品類(繼承抽象產品類) & 定義生產的具體產品;
步驟5:建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品例項的方法;
步驟6:客戶端通過例項化具體的工廠類,並呼叫其建立不同目標產品的方法建立不同具體產品類的例項
接下來我用乙個例項來對抽象工廠模式進行更深一步的介紹。
例項概況
使用步驟
步驟1:建立抽象工廠類,定義具體工廠的公共介面
abstract class factory
步驟2:建立抽象產品族類,定義具體產品的公共介面;
abstract class abstractproduct
步驟3:建立抽象產品類,定義具體產品的公共介面;
//容器產品抽象類
abstract class containerproduct extends abstractproduct
//模具產品抽象類
abstract class mouldproduct extends abstractproduct
步驟4:建立具體產品類(繼承抽象產品類), 定義生產的具體產品;
//容器產品a類
class containerproducta extends containerproduct
}//容器產品b類
class containerproductb extends containerproduct
}//模具產品a類
class mouldproducta extends mouldproduct
}//模具產品b類
class mouldproductb extends mouldproduct
}
步驟5:建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品例項的方法;
//a廠 - 生產模具+容器產品
class factorya extends factory
@override
public product manufacturemould()
}//b廠 - 生產模具+容器產品
class factoryb extends factory
@override
public product manufacturemould()
}
步驟6:客戶端通過例項化具體的工廠類,並呼叫其建立不同目標產品的方法建立不同具體產品類的例項
//生產工作流程
public class abstractfactorypattern
}
結果:
生產出了容器產品a
生產出了容器產品b
生產出了模具產品a
生產出了模具產品b
簡單工廠模式需要修改工廠類的判斷邏輯
簡單工廠中的工廠類存在複雜的switch邏輯判斷
簡單工廠模式的工廠類使用靜態工廠方法
抽象工廠模式很難支援新種類產品的變化。
這是因為抽象工廠介面中已經確定了可以被建立的產品集合,如果需要新增新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類的以及所有子類的改變,這樣也就違背了「開發——封閉」原則。
對於新的產品族符合開-閉原則;對於新的產品種類不符合開-閉原則,這一特性稱為開-閉原則的傾斜性。
在了解了優缺點後,我總結了工廠方法模式的應用場景:
參考於:
設計模式(四) 抽象工廠模式
前面說了兩種設計模式,簡單工廠模式和工廠模式。簡單工廠模式是定義乙個工廠類,工廠類根據呼叫時傳入的引數選擇建立哪乙個類的例項。工廠模式是為每個類建立乙個工廠,而這些工廠都實現了同乙個工廠,客戶端在呼叫的時候自己選擇某個類對應的工廠去建立某個類的例項。那抽象工廠又是什麼呢?抽象工廠在工廠模式的基礎上引...
設計模式(四) 抽象工廠模式
有時候我們需要乙個工廠可以提供多個產品物件,而不是單一的產品物件。為了更清晰地理解工廠方法模式,這裡先引入兩個概念 產品等級結構 即產品的繼承結構,比如乙個抽象類是電視機,其子類有海爾電視機 海信電視機 tcl電視機,則抽象電視機與具體品牌的電視機之間構成了乙個產品等級結構,抽象電視機是父類,而具體...
設計模式之四 抽象工廠模式
抽象工廠模式 abstract factory pattern 是圍繞乙個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式...