1、意圖
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
2、適用性
以下情況可用Abstract Factory 模式:
-
一個系統要獨立於它的產品的創建、組合和表示時。
-
一個系統要有多個產品系列中的一個來配置時。
-
當你要強調一系列相關產品對象的設計以便進行聯合使用時。
-
當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。
3、解決方案
協調對象組的創建。提供一種方式,將如何執行對象實例化的規則從使用這些對象的客戶對象提取出來。
4、通用結構
5、參與者
- AbstractFactory:聲明一個創建抽象產品對象的操作接口。
- ConcreteFactory:實現創建具體產品對象的操作。
- AbstractProduct:爲一類產品對象聲明一個接口。
- ConcreteProduct:定義一個將被相應的具體工廠創建的產品對象;實現AbstractProduct接口。
- Client:僅使用由AbstractFactory和AbstractProduct類聲明的接口。
6、協作
- 通常在運行時刻創建一個ConcreteFactory類的實例。這一具體的工廠對象實例創建具有特定實現的產品對象。爲創建不同的產品對象,用戶應使用不同的具體工廠。
- AbstractFactory將產品對象的創建延遲到它的ConcreteFactory子類。
7、效果
- 它分離了具體的類
- 它使得易於交換產品序列
- 它有利於產品的一致性
- 難以自持新種類的產品
8、實現
- 將ConcreteFactory作爲單件:一個應用中一般每個產品系列只需一個ConcreteFactory實例。因此,可將ConcreteFactory實現爲Singleton。
- 創建產品:AbstractFactory僅聲明一個創建產品的接口,真正創建產品是由ConcreteFactory實現的。
1)爲每個產品定義一個工廠方法。一個具體工廠將爲每個產品重定義該工廠方法以指定產品。優點:實現簡單;缺點:要求每個產品系列都要定義一個新的具體工廠子類,儘管這些產品系列的差別很小。
2)如果有多個可能的產品系列,具體工廠也可以使用Protocol模式來實現。具體工廠使用產品系列中每一個產品的原型實例來初始化,且它通過複製它的原型來創建新的產品。在基於原型的方法中,使得不是每一個新的產品系列都需要一個新的具體工廠類 - 定義可擴展的工廠:給創建對象的操作接口添加一個參數,該參數指定了將被創建的對象的種類8