設計模式:學習筆記(6)——抽象工廠模式
抽象工廠模式
在工廠方法模式中具體工廠負責生產具體的產品,每一個具體工廠都對應一種具體產品,工廠方法也具有唯一性,一般情況下,一個具體工廠只有一個工廠方法或者一組重載的工廠方法。但是有時候我們需要一個工廠可以提供多個產品對象,而不是單一的產品對象。此時我們需要使用抽象工廠模式。
抽象工廠模式與工廠方法模式最大的區別在於,工廠方法模式針對同一產品“大類”,而抽象工廠模式可以生產多個產品“大類”。
說明:在這裏呢,我們可以理解一個“大類”爲一個抽象產品接口。
模式定義
抽象工廠模式:爲創建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的具體類。
這個概念依然抽象難懂,但是如果你已經閱讀了工廠(方法)模式,那我們直接看類圖即可更加容易理解。
抽象工廠模式中的角色與工廠方法相同,也是4個角色:
- 抽象工廠角色
- 具體工廠角色
- 抽象產品角色
- 具體產品角色
模式分析
優缺點
抽象工廠模式的主要優點依然是隔離了具體類的生成,使得客戶並不需要知道什麼被創建,而且每次可以通過具體工廠類創建多個“大類”的對象,增加大類和大類對象比較方便,但是還是需要修改抽象工廠和具體工廠的代碼,違反了開閉原則。
模式應用
在很多軟件系統中需要更換界面主題,要求界面中的按鈕、文本框、背景色等一起發生改變時,可以使用抽象工廠模式進行設計。
實例
如下是一個抽象工廠模式的實例,現在抽象工廠可以生成多個產品“大類”
interface AbstractFactory{ Phone createPhone(String param); Mask createMask(String param); } class SuperFactory implements AbstractFactory{ @Override public Phone createPhone(String param) { return new iPhone(); } @Override public Mask createMask(String param) { return new N95(); } } interface Phone{ } class iPhone implements Phone{ } interface Mask{ } class N95 implements Mask{ }
參考資料
- https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html
- 《設計模式(Java版)》