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

1、抽象工廠模式的定義

爲建立一組相關或相互依賴的對象提供一個接口,並且無須指定它們的具體類。git

2、抽象工廠模式的應用

1.抽象工廠模式的優勢

  • 封裝性,每一個產品的實現類不是高層模塊要關心的,它要關心的是什麼?是接口,是抽象,它不關心對象是如何建立出來的,這由誰負責呢?工廠類,只要知道工廠類是誰,我就能建立出一個須要的對象,省時省力,優秀設計就應該如此;
  • 產品族內的約束爲非公開狀態。例如生產男女比例的問題上,猜測女媧娘娘確定有本身的打算,不能讓女盛男衰,不然女性的優勢不就體現不出來了嗎?那在抽象工廠模式,就應該有這樣的約束:每生產1個女性,就同時生產出1.2個男性,這樣的生產過程對調用工廠類的高層模塊來講是透明的,它不須要知道這個約束,我就是要一個黃色女性產品就能夠,具體的產品族內的約束是在工廠內實現的;

2.抽象工廠模式的缺點

抽象工廠模式的最大缺點就產品族擴展很是困難,爲何這麼說呢?咱們以通用代碼爲例,若是要增長一個產品C,也就是說產品家族由原來的2個增長到3個,抽象類AbstractCreator要增長一個方法createProductC(),而後兩個實現類毒藥修改,想一想看,這嚴重違背了開閉原則,並且咱們一直說明抽象類和接口是一個契約。改變契約,全部與契約有關係的代碼都要修改,那麼這段代碼叫有毒代碼,只要與這段代碼有關係,就可能產生侵害的危險。github

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

抽象工廠模式的使用場景定義很是簡單:一個對象族(或是一組沒有任何關係的對象)都有相同的約束,則可使用抽象工廠模式。
什麼意思呢?例如一個文本編輯器和一個圖片處理器,都是軟件實體,可是*nix下的文本編輯器和Window下的文本編輯器雖然功能和界面都相同,可是代碼實現是不一樣的,圖片處理器也有相似狀況。也就是具備了共同的約束條件:操做系統類型。因而咱們可使用抽象工廠模式,產生不一樣操做系統下的編輯器和圖片處理器。編輯器

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

在抽象工廠模式的缺點中,咱們提到抽象工廠模式的產品族擴展比較困難,可是必定要清楚,是產品族擴展困難,而不是產品等級。在該模式下,產品等級是很是容易擴展的,增長一個產品等級,只要增長一個工廠類負責新增長出來的產品生產任務便可。也就是說橫向擴展容易,縱向擴展困難。以人類爲例子,產品等級中只有男、女兩個性別,現實世界還有一種性別:雙性人,既是男人也是女人,那咱們要擴展這個產品等級也是很是容易,增長三個產品類,分別對應不一樣膚色,而後再建立一個工廠類,專門負責不一樣膚色人的雙性人的建立任務,徹底經過擴展來實現需求的變動,從這一點上看,抽象工廠模式是符合開閉原則的。spa

3、最佳實踐

抽象工廠模式是一個簡單的模式,使用的場景很是多,你們在軟件產品開發過程當中,涉及不一樣操做系統的時候,均可以考慮使用抽象工廠模式,例如一個應用須要在三個不一樣平臺(Window、Linux、Android)上運行,你會怎麼設計?分別設計三套不一樣的應用?非也,經過抽象工廠模式屏蔽掉操做系統對應用的影響。三個不一樣操做系統上的軟件功能、應用邏輯、UI都應該是很是相似的,惟一不一樣的是調用不一樣的工廠方法,由不一樣的產品類去處理與操做系統交互的信息。操作系統

相關代碼示例:https://github.com/developers-youcong/DesignPatternPractice/tree/master/AbstractFactory設計

相關文章
相關標籤/搜索