抽象工廠模式(Abstract Factory Pattern)

抽象工廠模式產(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)蓖宦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齐婴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子球昨,更是在濱河造成了極大的恐慌尔店,老刑警劉巖眨攘,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件主慰,死亡現(xiàn)場離奇詭異嚣州,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)共螺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門该肴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人藐不,你說我怎么就攤上這事匀哄。” “怎么了雏蛮?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵涎嚼,是天一觀的道長。 經(jīng)常有香客問我挑秉,道長法梯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任犀概,我火速辦了婚禮立哑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姻灶。我一直安慰自己铛绰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布产喉。 她就那樣靜靜地躺著捂掰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪曾沈。 梳的紋絲不亂的頭發(fā)上尘颓,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音晦譬,去河邊找鬼疤苹。 笑死,一個胖子當(dāng)著我的面吹牛敛腌,可吹牛的內(nèi)容都是我干的卧土。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼像樊,長吁一口氣:“原來是場噩夢啊……” “哼尤莺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起生棍,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤颤霎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體友酱,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晴音,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缔杉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锤躁。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖或详,靈堂內(nèi)的尸體忽然破棺而出系羞,到底是詐尸還是另有隱情,我是刑警寧澤霸琴,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布椒振,位于F島的核電站,受9級特大地震影響梧乘,放射性物質(zhì)發(fā)生泄漏杠人。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一宋下、第九天 我趴在偏房一處隱蔽的房頂上張望嗡善。 院中可真熱鬧,春花似錦学歧、人聲如沸罩引。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袁铐。三九已至,卻和暖如春横浑,著一層夾襖步出監(jiān)牢的瞬間剔桨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工徙融, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洒缀,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓欺冀,卻偏偏與公主長得像树绩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子隐轩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361