1、動機與定義
工廠模式中,乙個工廠僅僅能提供乙個或一類產品,當產品種類較多,形成產品系列(比方我們要建立跨平台的button,選單,文字框等等一系列gui控制項:
單純使用工廠模式會產生大量工廠,並且後期維護也不方便,我們能夠從產品中找到規律,假設產品等級相對固定,以後僅僅會新增產品族,那麼我們就能夠把整個產品族放到乙個工廠建立,以後新增其它系統產品族也很方便,例如以下圖:
這樣的模式就是抽象工廠,工廠方法模式針對的是乙個產品等級結構,而抽象工廠模式則須要面對多個產品等級結構,乙個工廠等級結構能夠負責多個不同產品等級結構中的產品物件的建立 。
2、結構與類圖
通用類圖例如以下:
文字開頭那個建立gui的樣例類圖例如以下,此處僅僅建立了button和textarea:
產品類和介面**例如以下(為了演示方便,省略邏輯等等):
inte***ce button
inte***ce textarea
class windowbutton implements button
class linuxbutton implements button
class windowtextarea implements textarea
class linuxtextarea implements textarea
工廠類**:
public inte***ce iguifactory
class linuxguifactory implements iguifactory
@override
public textarea createtextarea()
}class windowsguifactory implements iguifactory
@override
public textarea createtextarea()
}
client**:
public class client
}
有多少個產品族,就建立多少個工廠實現,有多少個產品等級,工廠中就要對外提供多少個建立產品方法。
3、適用場景及效果(優缺點)
事實上工廠模式的長處,抽象工廠基本都有的,這裡說說抽象工廠特有的長處:
1、約束產品族內部元素,能夠控制產品族內部各產品間關係,數量等,比方產品族內的產品有a、b,須要生產1個a時生成2個b,此時由於他們都在乙個工廠實現類中,所以很easy控制。
2、擴充套件產品族和工廠很easy,比方上面樣例中要擴充套件一類系統gui,比方說android的,新增�一套gui控制項和android的控制項工廠即可。
3、降低client推斷,當乙個產品族中的產品放到一起工作時,抽象工廠能確保client始終僅僅是用同乙個產品族中的產品,而不用依據當前環境推斷使用哪個產品了,比方使用了windowsguifactory,使用控制項時,client全然不用推斷是哪種作業系統了,僅僅須要用windowsguifactory獲取即可了。
缺點也是顯而易見的,最大缺點就是擴充套件產品等級很困難,還是上面的樣例,要新增一種控制項,要把全部的工廠都要加乙個方法,嚴重違反了開閉原則,改動介面,全部client**也要影響,所以抽象工廠一定要確保產品等級無變化或很少的變化。
事實上這也是設計上的一種權衡,有的時候要想讓一方面擴充套件、使用很easy,就會導致還有一方面很難擴充套件,假設業務上有這種傾斜性,我們就能夠做這種設計,沒有絕對好的設計,僅僅有適合的設計。
適用場景,當系統所提供的工廠所需生產的詳細產品並非乙個簡單的物件,而是多個位於不同產品等級結構中屬於不同型別的詳細產品時我們會考慮使用抽象工廠模式。結合上面的優缺點,舉幾個詳細的適用場景:
1、系統中有1個或多個產品族時,而每次僅僅是用1個產品族,如有些桌面程式須要更換主題,**等功能;
2、系統提供乙個產品類的庫時,全部產品以介面方式出現,能夠考慮使用抽象工廠;
3、系統同一類產品族要放到一起使用,關聯到一起這樣的約束最好在設計中體現,能夠使用抽象工廠。
4、模式擴充套件
1、工廠模式轉化,當產品等級僅僅有1個時,抽象工廠能夠退化成普通工廠,假設實現比較簡單,產品類不多時,普通工廠退化成簡單工廠。
2、工廠組合,抽象工廠、普通工廠當產品過多時,都會生成非常多工廠類,能夠考慮使用簡單工廠再將工廠類封裝一下,client獲取工廠時也會更方便。事實上,工廠模式是程式中用的最廣的一種模式,常常和其它模式組合使用,沒有哪個模式能100%使用某個環境,僅僅有模式的靈活變通,多模式混合才會產生優秀的設計。
設計模式03 抽象工廠
抽象工廠使用抽象類 或者介面 來定義某一類工廠的行為。uml圖如下 適用orangefoodfactory來建立橙色的食物 public class orangefoodfactory implements abstractfactory override public vegetables get...
設計模式初級 03 抽象工廠模式
一 定義 抽象工廠模式是利用乙個超級工廠來建立其他工廠。該設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在抽象工廠模式中,介面是負責建立乙個生成別的物件的工廠,而不是生產指定的類。每個生成物件的工廠都按照工廠模式提供物件。二 詳細介紹 解決問題 主要解決介面選擇的問題。使用場景 系統的產品...
設計模式學習 抽象工廠模式
抽象工廠模式,提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。抽象工廠模式的優點與缺點 優點 易於交換產品系列,由於具體工廠類在乙個應用中只需要在初始化的時候出現一次,這樣使得改變乙個應用的具體工廠變得非常容易,它只需要改變具體工廠即可使用不同的產品配置。它讓具體的建立例項過程與...