抽象工廠模式

概述

抽象工廠模式是對(duì)象的創(chuàng)建模式案腺,它是工廠方法模式的進(jìn)一步推廣庆冕。

假設(shè)一個(gè)子系統(tǒng)需要一些產(chǎn)品對(duì)象,而這些產(chǎn)品又屬于一個(gè)以上的產(chǎn)品等級(jí)結(jié)構(gòu)劈榨。那么為了將消費(fèi)這些產(chǎn)品對(duì)象的責(zé)任和創(chuàng)建這些產(chǎn)品對(duì)象的責(zé)任分割開(kāi)來(lái)访递,可以引進(jìn)抽象工廠模式。這樣的話同辣,消費(fèi)產(chǎn)品的一方不需要直接參與產(chǎn)品的創(chuàng)建工作拷姿,而只需要向一個(gè)公用的工廠接口請(qǐng)求所需要的產(chǎn)品。

通過(guò)使用抽象工廠模式旱函,可以處理具有相同(或者相似)等級(jí)結(jié)構(gòu)中的多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象的創(chuàng)建問(wèn)題响巢。如下圖所示:

根據(jù)產(chǎn)品角色的結(jié)構(gòu)圖,就不難給出工廠角色的結(jié)構(gòu)設(shè)計(jì)圖棒妨。

可以看出踪古,每一個(gè)工廠角色都有兩個(gè)工廠方法,分別負(fù)責(zé)創(chuàng)建分屬不同產(chǎn)品等級(jí)結(jié)構(gòu)的產(chǎn)品對(duì)象券腔。

抽象工廠的功能是為一系列相關(guān)對(duì)象或相互依賴的對(duì)象創(chuàng)建一個(gè)接口伏穆。一定要注意,這個(gè)接口內(nèi)的方法不是任意堆砌的纷纫,而是一系列相關(guān)或相互依賴的方法枕扫。比如上面例子中的主板和CPU,都是為了組裝一臺(tái)電腦的相關(guān)對(duì)象辱魁。不同的裝機(jī)方案烟瞧,代表一種具體的電腦系列诗鸭。

由于抽象工廠定義的一系列對(duì)象通常是相關(guān)或相互依賴的,這些產(chǎn)品對(duì)象就構(gòu)成了一個(gè)產(chǎn)品族参滴,也就是抽象工廠定義了一個(gè)產(chǎn)品族强岸。

這就帶來(lái)非常大的靈活性,切換產(chǎn)品族的時(shí)候卵洗,只要提供不同的抽象工廠實(shí)現(xiàn)就可以了请唱,也就是說(shuō)現(xiàn)在是以一個(gè)產(chǎn)品族作為一個(gè)整體被切換。

核心

先上一張圖:

我們還是以苦逼的程序猿為例來(lái)說(shuō)抽象工廠模式的一些核心概念过蹂。通過(guò)上圖你可以發(fā)現(xiàn)十绑,橫縱二維坐標(biāo)可以確定平面上一個(gè)唯一的點(diǎn),這也就是抽象工廠的核心酷勺。

產(chǎn)品等級(jí)結(jié)構(gòu):就是繼承結(jié)構(gòu)本橙。就像上面Android,IOS脆诉,PHP這些技能繼承自一個(gè)抽象的技能類(譬如前面的ICode)甚亭,這個(gè)抽象類與這些子類構(gòu)成了產(chǎn)品等級(jí)結(jié)構(gòu)。 同理的Android書击胜,C語(yǔ)言書亏狰,腳本書繼承自一個(gè)工具書類,這個(gè)工具書抽象類與這些子類構(gòu)成了等級(jí)結(jié)構(gòu)偶摔。

產(chǎn)品族:抽象工廠模式中的產(chǎn)品族官方定義是指由同一個(gè)工廠生產(chǎn)的暇唾,位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中的一組產(chǎn)品。 譬如上面的Android位于技能等級(jí)結(jié)構(gòu)中辰斋,Android書位于工具書等級(jí)結(jié)構(gòu)中策州,Android技能和Android書是位于不同產(chǎn)品結(jié)構(gòu)的一組產(chǎn)品,但是任何一個(gè)程序猿都需要具備技能和工具書宫仗, 譬如一個(gè)Android程序猿需要有Android技能及Android書够挂,所以這個(gè)Android程序猿就是一個(gè)產(chǎn)品族。

概念: 提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口藕夫,而無(wú)須指定它們具體的類孽糖。抽象工廠模式又稱為Kit模式,它是一種對(duì)象創(chuàng)建型模式毅贮。

重點(diǎn): 抽象工廠模式結(jié)構(gòu)重要核心模塊:

抽象工廠:

聲明一組用于創(chuàng)建一族產(chǎn)品的方法梭姓,每一個(gè)方法對(duì)應(yīng)一種產(chǎn)品。

具體工廠:

實(shí)現(xiàn)了在抽象工廠中聲明的創(chuàng)建產(chǎn)品的方法嫩码,生成一組具體產(chǎn)品,這些產(chǎn)品構(gòu)成了一個(gè)產(chǎn)品族罪既,每一個(gè)產(chǎn)品都位于某個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)中铸题。

抽象產(chǎn)品:

它為每種產(chǎn)品聲明接口铡恕,在抽象產(chǎn)品中聲明了產(chǎn)品所具有的業(yè)務(wù)方法。

具體產(chǎn)品:

定義具體工廠生產(chǎn)的具體產(chǎn)品對(duì)象丢间,實(shí)現(xiàn)抽象產(chǎn)品接口中聲明的業(yè)務(wù)方法探熔。

使用場(chǎng)景:

當(dāng)需要?jiǎng)?chuàng)建的對(duì)象是一系列相互關(guān)聯(lián)或相互依賴的產(chǎn)品族時(shí),便可以使用抽象工廠模式烘挫。 大白話意思就是一個(gè)繼承體系中诀艰,如果存在著多個(gè)等級(jí)結(jié)構(gòu)(即存在著多個(gè)抽象類,像上面的技能與工具書)饮六, 并且分屬各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類之間存在著一定的關(guān)聯(lián)或者約束其垄,就可以使用抽象工廠模式。當(dāng)然了卤橄, 同樣的道理就是如果各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類之間不存在關(guān)聯(lián)或約束绿满,則使用多個(gè)獨(dú)立的工廠來(lái)對(duì)產(chǎn)品進(jìn)行創(chuàng)建。

程序?qū)嵗?/p>

如下實(shí)例就是上圖何如上文字解釋的實(shí)現(xiàn)代碼窟扑,具體不再解釋:

復(fù)制代碼代碼如下:

package yanbober.github.io;

/*技能等級(jí)結(jié)構(gòu)部分*/

interface ICode {

void coding();

}

class CodeImplAndroid implements ICode {

@Override

public void coding() {

System.out.println("Coding Android!");

}

}

class CodeImplPHP implements ICode {

@Override

public void coding() {

System.out.println("Coding PHP!");

}

}

/*工具書等級(jí)結(jié)構(gòu)*/

interface INeedBook {

void lookBook();

}

class NeedBookImplAndroid implements INeedBook {

@Override

public void lookBook() {

System.out.println("Look Android Book!");

}

}

class NeedBookImplPHP implements INeedBook {

@Override

public void lookBook() {

System.out.println("Look PHP Book!");

}

}

/*產(chǎn)品族*/

interface IAbstractFactory {

ICode getCodingSkill();

INeedBook getNeedBook();

}

class FactoryImplAndroid implements IAbstractFactory {

@Override

public ICode getCodingSkill() {

return new CodeImplAndroid();

}

@Override

public INeedBook getNeedBook() {

return new NeedBookImplAndroid();

}

}

class FactoryImplPHP implements IAbstractFactory {

@Override

public ICode getCodingSkill() {

return new CodeImplPHP();

}

@Override

public INeedBook getNeedBook() {

return new NeedBookImplPHP();

}

}

public class Main {

public static void main(String[] args) {

IAbstractFactory factory = new FactoryImplAndroid();

ICode code = factory.getCodingSkill();

INeedBook book = factory.getNeedBook();

code.coding();

book.lookBook();

factory = new FactoryImplPHP();

code = factory.getCodingSkill();

book = factory.getNeedBook();

code.coding();

book.lookBook();

}

}

技巧Tips:依舊可以使用配置與反射實(shí)現(xiàn)自動(dòng)適應(yīng)喇颁。

總結(jié)一把

抽象工廠模式的優(yōu)點(diǎn):

和前面一樣,隔離具體類的生成嚎货,使客戶并不需要知道什么被創(chuàng)建橘霎。

增加新的產(chǎn)品族很方便,無(wú)須修改已有系統(tǒng)殖属,符合“開(kāi)閉原則”姐叁。

抽象工廠模式的缺點(diǎn):

增加新的產(chǎn)品等級(jí)結(jié)構(gòu)麻煩,需要對(duì)原有系統(tǒng)進(jìn)行較大的修改忱辅,甚至需要修改抽象層代碼七蜘,違背“開(kāi)閉原則”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市墙懂,隨后出現(xiàn)的幾起案子橡卤,更是在濱河造成了極大的恐慌,老刑警劉巖损搬,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碧库,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巧勤,警方通過(guò)查閱死者的電腦和手機(jī)嵌灰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颅悉,“玉大人沽瞭,你說(shuō)我怎么就攤上這事∈F浚” “怎么了驹溃?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵城丧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我豌鹤,道長(zhǎng)亡哄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任布疙,我火速辦了婚禮蚊惯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灵临。我一直安慰自己截型,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布俱诸。 她就那樣靜靜地躺著菠劝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睁搭。 梳的紋絲不亂的頭發(fā)上赶诊,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音园骆,去河邊找鬼舔痪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锌唾,可吹牛的內(nèi)容都是我干的锄码。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晌涕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼滋捶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起余黎,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤重窟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后惧财,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體巡扇,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年垮衷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厅翔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡搀突,死狀恐怖刀闷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤涩赢,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布戈次,位于F島的核電站,受9級(jí)特大地震影響筒扒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绊寻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一花墩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澄步,春花似錦冰蘑、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至梯皿,卻和暖如春仇箱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背东羹。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工剂桥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人属提。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓权逗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冤议。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斟薇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容