Factory
在物件導向世界裡,具體製造出物件或類別的地方。
Abstract Factory
以相同的介面來建立一整族相關或相依的物件,不須點明各物件真正所屬的具象類別。
範例
以 GUI 為例 Windows 陣營 跟 Apple 都有各自的 GUI
而你的功能已經定義了需要實作的 GUI
抽象工廠的想法即是,建立一個抽象類別 WidgetFactory (GUI 定義) ,各別實作 Windows 與 Apple 的工廠
1. 建立 Windows
2. 建立 Windows 與 Apple
優點
將具象類別隔開來
由於 Client 只能經由抽象介面來操作這些物件, 成品類別 被 ConcreteFactory 隱藏起來。
易於整組成品物件抽換掉
如果今天新增了一個 Android 版本 只需要根據 WidgetFactory 實做一個 AndroidWidgetFactory,並抽換掉即可。
一致性
確保應用程式同一時間只會使用到某一物件陣營。
即在 Windows 系統只會用到 WindowsWidgetFactory 及底下產生的物件,Apple 系統只會用到 AppleWidgetFactory 及底下產生的物件。
缺點
難以提供新的成品物件種類
如果今天要新增一個彈跳視窗(PopupWindow)
– 你必須在抽象類別 WidgetFactory 新增該方法
– 並在所有的實作,如 WindowsWidgetFactory、AppleWidgetFactory、AndroidWidgetFactory 實作方法
– 最後,建立物件的介面,然後再根據每一個工廠,建立物品的實體。
其他
實際應用時,為了確保應用程式同一時間只會使用到某一物件陣營這件事,可以搭配 Singleton (單一模式),確保同一時間只有一個實體物件。