抽象工廠模式的定義
抽象工廠模式(Abstract Factory Pattern)是一種比較常用的模式,其定義如下:
Provide an interface for creating families of related or dependent objects without specifying ir concrete classes.(為創建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的體類。)
抽象工廠模式是工廠方法模式的升級版本,在多個業務品種、業務分類時,通過抽象工廠模式需要的對象是一種非常好的解決方式。
通用類圖如下:
抽象工廠模式的應用
抽象工廠模式的優點
封裝性,每個產品的實現類不是高層模塊要關心的,它要關心的是什么?是接口,是抽象,它不關心對象是如何創建出來,這由誰負責呢?工廠類,只要知道工廠類是誰,我就能創建出一個需要的對象,省時省力,優秀設計就應該如此。
產品族內的約束為非公開狀態。具體的產品族內的約束是在工廠內實現的。
抽象工廠模式的缺點
抽象工廠模式的最大缺點就是產品族擴展非常困難
抽象工廠模式的使用場景
抽象工廠模式的使用場景定義非常簡單:一個對象族(或是一組沒有任何關系的對象)都有相同的約束,則可以使用抽象工廠模式。
什么意思呢?例如一個文本編輯器和一個圖片處理器,都是軟件實體,但是linix下的文本編輯器和Windows下的文本編輯器雖然功能和界面都相同,但是代碼實現是不同的,圖片處理器也有類似情況。也就是具有了共同的約束條件:操作系統類型。于是我們可以使用抽象工廠模式,產生不同操作系統下的編輯器和圖片處理器。
抽象工廠模式的注意事項
在抽象工廠模式的缺點中,我們提到抽象工廠模式的產品族擴展比較困難,但是一定要清楚,是產品族擴展困難,而不是產品等級。在該模式下,產品等級是非常容易擴展的,增加一個產品等級,只要增加一個工廠類負責新增加出來的產品生產任務即可。也就是說橫向擴展容易,縱向擴展困難。
這一點上看,抽象工廠模式是符合開閉原則的。
最佳實踐
一個模式在什么情況下才能夠使用,是很多讀者比較困惑的地方。抽象工廠模式是一個簡單的模式,使用的場景非常多,大家在軟件產品開發過程中,涉及不同操作系統的時候,都可以考慮使用抽象工廠模式,例如一個應用,需要在三個不同平臺(Windows、Linux、Android)上運行,你會怎么設計?分別設計三套不同的應用?非也,通過抽象工廠模式屏蔽掉操作系統對應用的影響。三個不同操作系統上的軟件功能、應用邏輯、UI都應該是非常類似的,唯一不同的是調用不同的工廠方法,由不同的產品類去處理與操作系統交互的信息。