前面我們聊了:
<a href="https://yq.aliyun.com/roundtable/65481?spm=a2c4e.11155435.0.0.51791ba7sHIQqJ">什麼是設計模式?你知道多少?</a>
<a href="https://yq.aliyun.com/roundtable/65858?spm=a2c4e.11155435.0.0.51791ba7sHIQqJ">你必須知道的六大設計原則</a>
<a href="https://yq.aliyun.com/roundtable/66041?spm=a2c4e.11155435.0.0.27161ba7mcAMKv">第一個設計模式,我是皇帝我獨苗,單例模式</a>
<a href="https://yq.aliyun.com/roundtable/66246?spm=a2c4e.11155435.0.0.ef8d1ba7v227KU">第二個設計模式,工廠方法模式</a>
今天我們來聊聊第三個設計模式,抽象工廠模式。

抽象工廠模式(Abstract Factory Pattern): 為建立一組相關或互相依賴的對象提供一個接口,而且無需指定它們的具體類。
主要解決:接口選擇的問題。
何時使用:系統的産品有多于一個的産品族,而系統隻消費其中某一族的産品。
如何解決:在一個産品族裡面,定義多個産品。
關鍵代碼:在一個工廠裡聚合多個同類産品。
優點:
封裝性:每個産品的實作類不是高層子產品要關心的,它要關心的是什麼?是接口,是抽象,它不關心對象是如何建立出
來,這由誰負責呢?工廠類,隻要知道工廠類是誰,我就能建立出一個需要的對象,省時省力,優秀設計就應該如
此。
當一個産品族中的多個對象被設計成一起工作時,它能保證用戶端始終隻使用同一個産品族中的對象。
産品族内的限制為非公開狀态。
缺點:産品族擴充非常困難,要增加一個系列的某一産品,既要在抽象的 Creator 裡加代碼,又要在具體的裡面加代碼。
使用場景: 1、QQ 換皮膚,一整套一起換。 2、生成不同作業系統的程式。
注意事項:産品族難擴充,産品等級易擴充。
與工廠方法模式的差別:
差別在于産品,如果産品單一,最合适用工廠模式,但是如果有多個業務品種、業務分類時,通過抽象工廠模式産生需要的對象是一種非常好的解決方式。再通俗深化了解下:工廠模式針對的是一個産品等級結構 ,抽象工廠模式針對的是面向多個産品等級結構的。
執行個體 -> 類 -> 類工廠
執行個體 -> 類 -> 類工廠 -> 抽象工廠
代碼示例
注意:有N個産品族,在抽象工廠類中就應該有N個建立方法。
注意:M個實作工廠類,在每個實作工廠中,實作不同産品族的生産任務。
最佳實踐
一個模式在什麼情況下才能夠使用,是很多人比較困惑的地方。抽象工廠模式是一個簡單的模式,使用的場景非常多,大家在軟體産品開發過程中,涉及不同的作業系統的時候,都可以考慮使用抽象工廠模式,例如一個應用,需要在三個不同平台(Windows、Linux、Android)上運作,你會怎麼設計?分别設計三套不同的應用?NONONO,通過抽象工廠模式屏蔽掉作業系統對應用的影響。三個不同作業系統上的軟體功能、應用邏輯、UI都應該是非常類似的,唯一不同的是調用不同的工廠方法,由不同的産品類去處理與作業系統互動的資訊。
那麼問題來了:
1、它還可以應用于哪些具體應用場景?
2、你做過的項目中采用抽象工廠模式了嗎?是否與其它模式混合使用?
3、抽象工廠模式與工廠方法模式的差別有沒有更通俗易懂的類比或解釋?
4、說說你對抽象工廠模式存在的疑問,或在使用時遇到的那些坑。