爲建立一組相關或相互依賴的對象提供一個接口,並且無須指定它們的具體類。git
抽象工廠模式的最大缺點就產品族擴展很是困難,爲何這麼說呢?咱們以通用代碼爲例,若是要增長一個產品C,也就是說產品家族由原來的2個增長到3個,抽象類AbstractCreator要增長一個方法createProductC(),而後兩個實現類毒藥修改,想一想看,這嚴重違背了開閉原則,並且咱們一直說明抽象類和接口是一個契約。改變契約,全部與契約有關係的代碼都要修改,那麼這段代碼叫有毒代碼,只要與這段代碼有關係,就可能產生侵害的危險。github
抽象工廠模式的使用場景定義很是簡單:一個對象族(或是一組沒有任何關係的對象)都有相同的約束,則可使用抽象工廠模式。
什麼意思呢?例如一個文本編輯器和一個圖片處理器,都是軟件實體,可是*nix下的文本編輯器和Window下的文本編輯器雖然功能和界面都相同,可是代碼實現是不一樣的,圖片處理器也有相似狀況。也就是具備了共同的約束條件:操做系統類型。因而咱們可使用抽象工廠模式,產生不一樣操做系統下的編輯器和圖片處理器。編輯器
在抽象工廠模式的缺點中,咱們提到抽象工廠模式的產品族擴展比較困難,可是必定要清楚,是產品族擴展困難,而不是產品等級。在該模式下,產品等級是很是容易擴展的,增長一個產品等級,只要增長一個工廠類負責新增長出來的產品生產任務便可。也就是說橫向擴展容易,縱向擴展困難。以人類爲例子,產品等級中只有男、女兩個性別,現實世界還有一種性別:雙性人,既是男人也是女人,那咱們要擴展這個產品等級也是很是容易,增長三個產品類,分別對應不一樣膚色,而後再建立一個工廠類,專門負責不一樣膚色人的雙性人的建立任務,徹底經過擴展來實現需求的變動,從這一點上看,抽象工廠模式是符合開閉原則的。spa
抽象工廠模式是一個簡單的模式,使用的場景很是多,你們在軟件產品開發過程當中,涉及不一樣操做系統的時候,均可以考慮使用抽象工廠模式,例如一個應用須要在三個不一樣平臺(Window、Linux、Android)上運行,你會怎麼設計?分別設計三套不一樣的應用?非也,經過抽象工廠模式屏蔽掉操做系統對應用的影響。三個不一樣操做系統上的軟件功能、應用邏輯、UI都應該是很是相似的,惟一不一樣的是調用不一樣的工廠方法,由不一樣的產品類去處理與操做系統交互的信息。操作系統
相關代碼示例:https://github.com/developers-youcong/DesignPatternPractice/tree/master/AbstractFactory設計