抽象工廠模式產(chǎn)生的動機(jī):
? ? ? ?為了更清晰地理解工廠方法模式伐弹,需要先引入兩個概念:
? ? ?? 產(chǎn)品等級結(jié)構(gòu) :產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu)然低,如一個抽象類是電視機(jī)鹿蜀,其子類有海爾電視機(jī)庵佣、海信電視機(jī)满哪、TCL電視機(jī)婿斥,則抽象電視機(jī)與具體品牌的電視機(jī)之間構(gòu)成了一個產(chǎn)品等級結(jié)構(gòu),抽象電視機(jī)是父類哨鸭,而具體品牌的電視機(jī)是其子類民宿。
?? ? ? ?產(chǎn)品族 :在抽象工廠模式中,產(chǎn)品族是指由同一個工廠生產(chǎn)的像鸡,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品活鹰,如海爾電器工廠生產(chǎn)的海爾電視機(jī)、海爾電冰箱只估,海爾電視機(jī)位于電視機(jī)產(chǎn)品等級結(jié)構(gòu)中志群,海爾電冰箱位于電冰箱產(chǎn)品等級結(jié)構(gòu)中。
在工廠方法模式中具體工廠負(fù)責(zé)生產(chǎn)具體的產(chǎn)品蛔钙,每一個具體工廠對應(yīng)一種具體產(chǎn)品锌云,工廠方法也具有唯一性,一般情況下夸楣, 一個具體工廠中只有一個工廠方法或者一組重載的工廠方法宾抓。但是有時候我們需要一個工廠可以提供多個產(chǎn)品對象子漩,而不是單一的產(chǎn)品對象豫喧。??
當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個簡單的對象,而是多個位于不同產(chǎn)品等級結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時需要使用抽象工廠模式幢泼。
抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)紧显。
抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方法模式針對的是一個產(chǎn)品等級結(jié)構(gòu)缕棵,而抽象工廠模式則需要面對多個產(chǎn)品等級結(jié)構(gòu)孵班, 一個工廠等級結(jié)構(gòu)可以負(fù)責(zé)多個不同產(chǎn)品等級結(jié)構(gòu)中的產(chǎn)品對象的創(chuàng)建 涉兽。當(dāng)一個工廠等級結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級結(jié)構(gòu)的一個產(chǎn)品族中的所有對象時, 抽象工廠模式比工廠方法模式更為簡單篙程、有效率枷畏。
定義:抽象工廠模式(Abstract Factory Pattern):提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類虱饿。抽象工廠模式又稱為Kit模式拥诡,屬于對象創(chuàng)建型模式。
結(jié)構(gòu):
?AbstractFactory(抽象工廠):它聲明了一組用于創(chuàng)建一族產(chǎn)品的方法氮发,每一個方法對應(yīng)一種產(chǎn)品渴肉。
ConcreteFactory(具體工廠):它實(shí)現(xiàn)了在抽象工廠中聲明的創(chuàng)建產(chǎn)品的方法,生成一組具體產(chǎn)品爽冕,這些產(chǎn)品構(gòu)成了一個產(chǎn)品族仇祭,每一個產(chǎn)品都位于某個產(chǎn)品等級結(jié)構(gòu)中。
AbstractProduct(抽象產(chǎn)品):它為每種產(chǎn)品聲明接口颈畸,在抽象產(chǎn)品中聲明了產(chǎn)品所具有的業(yè)務(wù)方法乌奇。
ConcreteProduct(具體產(chǎn)品):它定義具體工廠生產(chǎn)的具體產(chǎn)品對象,實(shí)現(xiàn)抽象產(chǎn)品接口中聲明的業(yè)務(wù)方法眯娱。
具體結(jié)構(gòu)圖:
產(chǎn)品類:
public?interface?ProductA{}
public?class?ProductA1implements?ProductA?{
?public?ProductA1(){
System.out.print("create?ProductA1");
}
}
public?class?ProductA2implements?ProductA?{
?public?ProductA2(){
System.out.print("create?ProductA2");
}
}
public?interface?ProductB{}
public?class?ProductB1implements?ProductB?{
?public?ProductB1(){
System.out.print("create?ProductB1");
}
}
public?class?ProductB2implements?ProductB?{
?public?ProductB2(){
System.out.print("create?ProductB2");
}
}
工廠類:
public?interface?abstractFactory?{
?public?ProductA?createProductA();
?public?ProductB?createProductB();
}
public?class?FactoryAimplements?abstractFactory?{
?@Override
? ??public?ProductA?createProductA()?{
?return?new?ProductA1();
}
?@Override
? ??public?ProductB?createProductB()?{
?return?new?ProductB1();
}
}
public?class?FactoryBimplements?abstractFactory?{
?@Override
? ??public?ProductA?createProductA()?{
?return?new?ProductA2();
}
?@Override
? ??public?ProductB?createProductB()?{
?return?new?ProductB2();
}
}
客戶端:
FactoryA?factoryA?=new?FactoryA();
ProductA?productA?=?factoryA.createProductA();
ProductB?productB?=?factoryA.createProductB();
FactoryBfactoryB?=new?FactoryB();
ProductA?producta?=?factoryB.createProductA();
ProductB?productb?=?factoryB.createProductB();
抽象工廠模式優(yōu)點(diǎn):
抽象工廠模式隔離了具體類的生成华弓,使得客戶并不需要知道什么被創(chuàng)建。由于這種隔離困乒,更換一個具體工廠就變得相對容易寂屏。 所有的具體工廠都實(shí)現(xiàn)了抽象工廠中定義的那些公共接口,因此只需改變具體工廠的實(shí)例娜搂,就可以在某種程度上改變整個軟件系統(tǒng)的行為迁霎。 另外,應(yīng)用抽象工廠模式可以實(shí)現(xiàn)高內(nèi)聚低耦合的設(shè)計目的百宇,因此抽象工廠模式得到了廣泛的應(yīng)用考廉。
當(dāng)一個產(chǎn)品族中的多個對象被設(shè)計成一起工作時,它能夠保證客戶端始終只使用同一個產(chǎn)品族中的對象携御。 這對一些需要根據(jù)當(dāng)前環(huán)境來決定其行為的軟件系統(tǒng)來說昌粤,是一種非常實(shí)用的設(shè)計模式。
增加新的具體工廠和產(chǎn)品族很方便啄刹,無須修改已有系統(tǒng)涮坐,符合“開閉原則”。
抽象工廠模式的缺點(diǎn):
在添加新的產(chǎn)品對象時誓军,難以擴(kuò)展抽象工廠來生產(chǎn)新種類的產(chǎn)品袱讹,這是因?yàn)樵诔橄蠊S角色中規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合, 要支持新種類的產(chǎn)品就意味著要對該接口進(jìn)行擴(kuò)展昵时,而這將涉及到對抽象工廠角色及其所有子類的修改捷雕,顯然會帶來較大的不便椒丧。
開閉原則的傾斜性(增加新的工廠和產(chǎn)品族容易,增加新的產(chǎn)品等級結(jié)構(gòu)麻煩)救巷。
“開閉原則”的傾斜性:
? ? ? ?1壶熏、“開閉原則”要求系統(tǒng)對擴(kuò)展開放,對修改封閉浦译,通過擴(kuò)展達(dá)到增強(qiáng)其功能的目的久橙。對于涉及到多個產(chǎn)品族與多個產(chǎn)品等級結(jié)構(gòu)的系統(tǒng),其功能增強(qiáng)包括兩方面:
? ? ? ? ? ? ? 增加產(chǎn)品族:對于增加新的產(chǎn)品族管怠,工廠方法模式很好的支持了“開閉原則”淆衷,對于新增加的產(chǎn)品族,只需要對應(yīng)增加一個新的具體工廠即可渤弛,對已有代碼無須做任何修改祝拯。
? ? ? ? ? ? ? 增加新的產(chǎn)品等級結(jié)構(gòu):對于增加新的產(chǎn)品等級結(jié)構(gòu),需要修改所有的工廠角色她肯,包括抽象工廠類佳头,在所有的工廠類中都需要增加生產(chǎn)新產(chǎn)品的方法,不能很好地支持“開閉原則”晴氨。
? ? ?? 2康嘉、 抽象工廠模式的這種性質(zhì)稱為“開閉原則”的傾斜性,抽象工廠模式以一種傾斜的方式支持增加新的產(chǎn)品籽前,它為新產(chǎn)品族的增加提供方便亭珍,但不能為新的產(chǎn)品等級結(jié)構(gòu)的增加提供這樣的方便。
抽象工廠模式適用環(huán)境:
一個系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建枝哄、組合和表達(dá)的細(xì)節(jié)肄梨,這對于所有類型的工廠模式都是重要的。
系統(tǒng)中有多于一個的產(chǎn)品族挠锥,而每次只使用其中某一產(chǎn)品族众羡。
屬于同一個產(chǎn)品族的產(chǎn)品將在一起使用,這一約束必須在系統(tǒng)的設(shè)計中體現(xiàn)出來蓖租。
系統(tǒng)提供一個產(chǎn)品類的庫粱侣,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實(shí)現(xiàn)蓖宦。