本篇文章介紹一種設計模式——工廠模式。工廠模式是用來封裝物件的建立,減少應用程式和具體類之間的依賴,促進松耦合。根據工廠模式的應用特性,一共分為三種子模式:簡單工廠模式,工廠方法模式和抽象工廠模式。本篇文章主要介紹抽象工廠模式。本篇文章內容參考抽象工廠模式,【原】從頭學習設計模式(四)——抽象工廠模式。1.定義
定義很難懂?沒錯,看起來是很抽象,不過這正反應了這種模式的強大。下面具體闡述下定義。
2.定義闡述
在工廠方法模式中具體工廠負責生產具體的產品,每乙個具體工廠對應一種或幾種具體產品,工廠方法也具有唯一性,一般情況下,乙個具體工廠中只有乙個工廠方法或者一組過載的工廠方法。但是有時候我們需要乙個工廠可以提供多個不同種類產品物件,而不是單一種類的產品物件。
為了更清晰地理解工廠方法模式,需要先引入兩個概念:
產品等級結構 :產品等級結構即產品的繼承結構,如乙個抽象類是電視機,其子類有海爾電視機、海信電視機、tcl電視機,則抽象電視機與具體品牌的電視機之間構成了乙個產品等級結構,抽象電視機是父類,而具體品牌的電視機是其子類。
產品族 :在抽象工廠模式中,產品族是指由同乙個工廠生產的,位於不同產品等級結構中的一組產品,如海爾電器工廠生產的海爾電視機、海爾電冰箱,海爾電視機位於電視機產品等級結構中,海爾電冰箱位於電冰箱產品等級結構中。
當系統所提供的工廠所需生產的具體產品並不是乙個簡單的物件,而是多個位於不同產品等級結構中屬於不同型別的具體產品時需要使用抽象工廠模式。
抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態。
抽象工廠模式與工廠方法模式最大的區別在於,工廠方法模式針對的是乙個產品等級結構,而抽象工廠模式則需要面對多個產品等級結構,乙個工廠等級結構可以負責多個不同產品等級結構中的產品物件的建立 。當乙個工廠等級結構可以建立出分屬於不同產品等級結構的乙個產品族中的所有物件時,抽象工廠模式比工廠方法模式更為簡單、有效率。
1.模式結構
抽象工廠模式包含如下角色:
abstractfactory:抽象工廠
concretefactory:具體工廠
abstractproduct:抽象產品
product:具體產品
2.時序圖
①先呼叫具體工廠物件中的方法createproductx()。根據具體工廠不同可以選擇不同的方法,針對同一種工廠也可以選擇不同的方法建立不同型別的產品物件。
②根據傳入產品型別引數(也可以無參),獲得具體的產品物件
③返回產品物件並使用
假設有乙個移動終端工廠,可以製造蘋果系列的移動產品和三星系列的移動產品。這個工廠下有兩個子廠,乙個負責製造蘋果系列的pad和三星系列的pad,另乙個負責製造蘋果系列的手機和三星系列的手機。這便是乙個典型的抽象工廠的例項。
抽象產品: 蘋果系列
public
抽象產品: 三星系列
public
inte***ce sumsung
具體產品:iphone
public
class
iphone
implements
}
具體產品:ipad
public
class
ipad
implements
}
具體產品:note2
public
class
note2
implements
sumsung
}
具體產品:tabs
public
class
tabs
implements
sumsung
}
抽象工廠
public
inte***ce factory
手機工廠
public
class
factory_phone
implements
factory
public sumsung createsumsungproduct()
}
pad工廠
public
class
factory_pad
implements
factory
public sumsung createsumsungproduct()
}
客戶端呼叫
public
static
void
main(string args)
抽象工廠可以通過多型,來動態設定不同的工廠,生產不同的產品,同時每個工廠中的產品又不屬於同乙個產品等級結構。
優點①抽象工廠模式隔離了具體類的生成,使得客戶並不需要知道什麼被建立。由於這種隔離,更換乙個具體工廠就變得相對容易。所有的具體工廠都實現了抽象工廠中定義的那些公共介面,因此只需改變具體工廠的例項,就可以在某種程度上改變整個軟體系統的行為。另外,應用抽象工廠模式可以實現高內聚低耦合的設計目的,因此抽象工廠模式得到了廣泛的應用。
②增加新的具體工廠和產品族很方便,因為乙個具體的工廠實現代表的是乙個產品族,無須修改已有系統,符合「開閉原則」。
缺點在新增新的產品物件(不同於現有的產品等級結構)時,難以擴充套件抽象工廠來生產新種類的產品,這是因為在抽象工廠角色中規定了所有可能被建立的產品集合,要支援新種類的產品就意味著要對該介面進行擴充套件,而這將涉及到對抽象工廠角色及其所有子類的修改,顯然會帶來較大的不便。
開閉原則的傾斜性(增加新的工廠和產品族容易,增加新的產品等級結構麻煩)。
適用環境
在以下情況下可以使用抽象工廠模式:
①乙個系統不應當依賴於產品類例項如何被建立、組合和表達的細節,這對於所有型別的工廠模式都是重要的。
②系統中有多於乙個的產品族,而每次只使用其中某一產品族。與工廠方法模式的區別
③屬於同乙個產品族的產品將在一起使用,這一約束必須在系統的設計中體現出來。
④系統提供乙個產品類的庫,所有的產品以同樣的介面出現,從而使客戶端不依賴於具體實現。
詳解工廠設計模式
先來說說設計模式的分類,主要分為以下大類 建立乙個工廠類,對實現了同一介面的一些類進行例項的建立。舉例如下 我們舉乙個傳送郵件和簡訊的例子 建立二者的共同介面 public inte ce sender 建立實現類 public class mailsender implements sender ...
設計模式之三 工廠模式
如果要擴充套件的話,則要修改源 這樣如果以後產生的phone型別很多,那麼就要一直修改,維護成本高 如果萬一你哪個型別寫錯了怎麼辦 所以出現了工廠模式。工廠模式簡單來說就是乙個工廠對應乙個產品。比如說iphonefactory產生iphone系列的手機,xiaomifactory產生xiaomi系列...
設計模式之工廠模式(三)
意圖 定義乙個建立物件的介面,讓其子類自己決定例項化哪乙個工廠類,工廠模式使其建立過程延遲到子類進行。主要解決 主要解決介面選擇的問題。以下我們以乙個汽車工廠為例子。建立乙個介面 汽車的介面 public inte ce car建立實現介面的實體類,賓士車,寶馬車,現代車。public class ...