1. 程式人生 > >《設計模式之禪》之抽象工廠模式

《設計模式之禪》之抽象工廠模式

一、抽象工廠模式的定義

為建立一組相關或相互依賴的物件提供一個介面,而且無須指定它們的具體類。

二、抽象工廠模式的應用

1.抽象工廠模式的優點

  • 封裝性,每個產品的實現類不是高層模組要關心的,它要關心的是什麼?是介面,是抽象,它不關心物件是如何創建出來的,這由誰負責呢?工廠類,只要知道工廠類是誰,我就能創建出一個需要的物件,省時省力,優秀設計就應該如此;
  • 產品族內的約束為非公開狀態。例如生產男女比例的問題上,猜想女媧娘娘肯定有自己的打算,不能讓女盛男衰,否則女性的優點不就體現不出來了嗎?那在抽象工廠模式,就應該有這樣的約束:每生產1個女性,就同時生產出1.2個男性,這樣的生產過程對呼叫工廠類的高層模組來說是透明的,它不需要知道這個約束,我就是要一個黃色女性產品就可以,具體的產品族內的約束是在工廠內實現的;

2.抽象工廠模式的缺點

抽象工廠模式的最大缺點就產品族擴充套件非常困難,為什麼這麼說呢?我們以通用程式碼為例,如果要增加一個產品C,也就是說產品家族由原來的2個增加到3個,抽象類AbstractCreator要增加一個方法createProductC(),然後兩個實現類毒藥修改,想想看,這嚴重違背了開閉原則,而且我們一直說明抽象類和介面是一個契約。改變契約,所有與契約有關係的程式碼都要修改,那麼這段程式碼叫有毒程式碼,只要與這段程式碼有關係,就可能產生侵害的危險。

3.抽象工廠模式的使用場景

抽象工廠模式的使用場景定義非常簡單:一個物件族(或是一組沒有任何關係的物件)都有相同的約束,則可以使用抽象工廠模式。

什麼意思呢?例如一個文字編輯器和一個圖片處理器,都是軟體實體,但是*nix下的文字編輯器和Window下的文字編輯器雖然功能和介面都相同,但是程式碼實現是不同的,圖片處理器也有類似情況。也就是具有了共同的約束條件:作業系統型別。於是我們可以使用抽象工廠模式,產生不同作業系統下的編輯器和圖片處理器。

4.抽象工廠模式的注意實現

在抽象工廠模式的缺點中,我們提到抽象工廠模式的產品族擴充套件比較困難,但是一定要清楚,是產品族擴充套件困難,而不是產品等級。在該模式下,產品等級是非常容易擴充套件的,增加一個產品等級,只要增加一個工廠類負責新增加出來的產品生產任務即可。也就是說橫向擴充套件容易,縱向擴充套件困難。以人類為例子,產品等級中只有男、女兩個性別,現實世界還有一種性別:雙性人,既是男人也是女人,那我們要擴充套件這個產品等級也是非常容易,增加三個產品類,分別對應不同膚色,然後再建立一個工廠類,專門負責不同膚色人的雙性人的建立任務,完全通過擴充套件來實現需求的變更,從這一點上看,抽象工廠模式是符合開閉原則的。

三、最佳實踐

抽象工廠模式是一個簡單的模式,使用的場景非常多,大家在軟體產品開發過程中,涉及不同作業系統的時候,都可以考慮使用抽象工廠模式,例如一個應用需要在三個不同平臺(Window、Linux、Android)上執行,你會怎麼設計?分別設計三套不同的應用?非也,通過抽象工廠模式遮蔽掉作業系統對應用的影響。三個不同作業系統上的軟體功能、應用邏輯、UI都應該是非常類似的,唯一不同的是呼叫不同的工廠方法,由不同的產品類去處理與作業系統互動的資訊。

相關程式碼示例:https://github.com/developers-youcong/DesignPatternPractice/tree/master/AbstractFac