設(shè)計(jì)模式-抽象工廠模式

這一篇博文來介紹工廠模式中的第三種抽象工廠模式。

介紹

抽象工廠模式(Abstract Factory Pattern):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口卸伞,而無須指定它們具體的類杏头。抽象工廠模式又稱為Kit模式欲间,屬于對(duì)象創(chuàng)建型模式。
抽象工廠模式不同于前面兩個(gè)模式匀泊,這篇也用支付的案例來講解优训。

現(xiàn)實(shí)中發(fā)生的支付情況可能是這樣:
支付都有個(gè)商戶號(hào),然而現(xiàn)在有兩個(gè)商戶號(hào)各聘,需要在不同時(shí)間段切換使用揣非,例如上午使用A支付商戶號(hào)、下午使用B支付商戶號(hào)躲因。


這里寫圖片描述

優(yōu)點(diǎn)

抽象工廠模式隔離了具體類的生成早敬,使得客戶并不需要知道什么被創(chuàng)建。由于這種隔離大脉,更換一個(gè)具體工廠就變得相對(duì)容易搞监。所有的具體工廠都實(shí)現(xiàn)了抽象工廠中定義的那些公共接口,因此只需改變具體工廠的實(shí)例镰矿,就可以在某種程度上改變整個(gè)軟件系統(tǒng)的行為琐驴。另外,應(yīng)用抽象工廠模式可以實(shí)現(xiàn)高內(nèi)聚低耦合的設(shè)計(jì)目的秤标,因此抽象工廠模式得到了廣泛的應(yīng)用绝淡。
當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能夠保證客戶端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象抛杨。這對(duì)一些需要根據(jù)當(dāng)前環(huán)境來決定其行為的軟件系統(tǒng)來說够委,是一種非常實(shí)用的設(shè)計(jì)模式。
增加新的具體工廠和產(chǎn)品族很方便怖现,無須修改已有系統(tǒng),符合“開閉原則”。

缺點(diǎn)

在添加新的產(chǎn)品對(duì)象時(shí)屈嗤,難以擴(kuò)展抽象工廠來生產(chǎn)新種類的產(chǎn)品潘拨,這是因?yàn)樵诔橄蠊S角色中規(guī)定了所有可能被創(chuàng)建的產(chǎn)品集合,要支持新種類的產(chǎn)品就意味著要對(duì)該接口進(jìn)行擴(kuò)展饶号,而這將涉及到對(duì)抽象工廠角色及其所有子類的修改铁追,顯然會(huì)帶來較大的不便。
開閉原則的傾斜性(增加新的工廠和產(chǎn)品族容易茫船,增加新的產(chǎn)品等級(jí)結(jié)構(gòu)麻煩)琅束。

案例

早晨支付抽象類

public abstract class MorningPay {
    public abstract void morningOrderPay();
}

早晨支付寶支付類

public class MorningAliPay extends MorningPay {

    @Override
    public void morningOrderPay() {
        System.out.println("支付寶支付");
    }

}

早晨微信支付類

public class MorningWechatPay extends MorningPay {

    @Override
    public void morningOrderPay() {
        System.out.println("微信支付");
    }

}

下午的支付類同上,就不貼出來了


抽象工廠類

public abstract class PayFactory {
    public abstract MorningPay getMorningPay();
    
    public abstract AfternoonPay getAfternoonPay();
}

支付寶抽象工廠類

public class AliPayFactory extends PayFactory {

    @Override
    public MorningPay getMorningPay() {
        return new MorningAliPay();
    }

    @Override
    public AfternoonPay getAfternoonPay() {
        return new AfternoonAliPay();
    }

}

微信支付工廠類

public class WechatPayFactory extends PayFactory {

    @Override
    public MorningPay getMorningPay() {
        return new MorningWechatPay();
    }

    @Override
    public AfternoonPay getAfternoonPay() {
        return new AfternoonWechatPay();
    }

}

具體代碼見Github地址

總結(jié)

抽象工廠模式提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口算谈,而無須指定它們具體的類涩禀。抽象工廠模式又稱為Kit模式,屬于對(duì)象創(chuàng)建型模式然眼。
抽象工廠模式包含四個(gè)角色:抽象工廠用于聲明生成抽象產(chǎn)品的方法艾船;具體工廠實(shí)現(xiàn)了抽象工廠聲明的生成抽象產(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ù)方法带欢。
抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)运授。抽象工廠模式與工廠方法模式最大的區(qū)別在于,工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)洪囤,而抽象工廠模式則需要面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)徒坡。
抽象工廠模式的主要優(yōu)點(diǎn)是隔離了具體類的生成,使得客戶并不需要知道什么被創(chuàng)建瘤缩,而且每次可以通過具體工廠類創(chuàng)建一個(gè)產(chǎn)品族中的多個(gè)對(duì)象喇完,增加或者替換產(chǎn)品族比較方便,增加新的具體工廠和產(chǎn)品族很方便剥啤;主要缺點(diǎn)在于增加新的產(chǎn)品等級(jí)結(jié)構(gòu)很復(fù)雜锦溪,需要修改抽象工廠和所有的具體工廠類,對(duì)“開閉原則”的支持呈現(xiàn)傾斜性府怯。
抽象工廠模式適用情況包括:一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建刻诊、組合和表達(dá)的細(xì)節(jié);系統(tǒng)中有多于一個(gè)的產(chǎn)品族牺丙,而每次只使用其中某一產(chǎn)品族则涯;屬于同一個(gè)產(chǎn)品族的產(chǎn)品將在一起使用复局;系統(tǒng)提供一個(gè)產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn)粟判,從而使客戶端不依賴于具體實(shí)現(xiàn)亿昏。


其實(shí)抽象工廠的方法經(jīng)常以工廠方法的方式實(shí)現(xiàn)。而且在抽象工廠中還可以使用簡(jiǎn)單工廠方法档礁,著支付案例中就可以用簡(jiǎn)單工廠方法獲取具體實(shí)例化哪個(gè)支付類角钩,這邊就不再進(jìn)行說明。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末呻澜,一起剝皮案震驚了整個(gè)濱河市递礼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羹幸,老刑警劉巖脊髓,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異睹欲,居然都是意外死亡供炼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門窘疮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袋哼,“玉大人,你說我怎么就攤上這事闸衫√喂幔” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蔚出,是天一觀的道長(zhǎng)弟翘。 經(jīng)常有香客問我,道長(zhǎng)骄酗,這世上最難降的妖魔是什么稀余? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮趋翻,結(jié)果婚禮上睛琳,老公的妹妹穿的比我還像新娘。我一直安慰自己踏烙,他們只是感情好师骗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讨惩,像睡著了一般辟癌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上荐捻,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天黍少,我揣著相機(jī)與錄音寡夹,去河邊找鬼。 笑死仍侥,一個(gè)胖子當(dāng)著我的面吹牛要出,可吹牛的內(nèi)容都是我干的鸳君。 我是一名探鬼主播农渊,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼或颊!你這毒婦竟也來了砸紊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤囱挑,失蹤者是張志新(化名)和其女友劉穎醉顽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體平挑,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡游添,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了通熄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唆涝。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖唇辨,靈堂內(nèi)的尸體忽然破棺而出廊酣,到底是詐尸還是另有隱情,我是刑警寧澤赏枚,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布亡驰,位于F島的核電站,受9級(jí)特大地震影響饿幅,放射性物質(zhì)發(fā)生泄漏凡辱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一栗恩、第九天 我趴在偏房一處隱蔽的房頂上張望透乾。 院中可真熱鬧,春花似錦摄凡、人聲如沸续徽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钦扭。三九已至,卻和暖如春床绪,著一層夾襖步出監(jiān)牢的瞬間客情,已是汗流浹背其弊。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膀斋,地道東北人梭伐。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像仰担,于是被迫代替她去往敵國(guó)和親糊识。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 設(shè)計(jì)原則: 要依賴抽象摔蓝,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是抽象工廠模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,114評(píng)論 0 6
  • 抽象工廠模式 介紹 工廠方法模式通過引入工廠等級(jí)結(jié)構(gòu)赂苗,解決了簡(jiǎn)單工廠模式中工廠類職責(zé)太重的問題,但由于工廠方法模式...
    666真666閱讀 1,227評(píng)論 0 7
  • 前言 Android的設(shè)計(jì)模式系列文章介紹贮尉,歡迎關(guān)注拌滋,持續(xù)更新中: Android的設(shè)計(jì)模式-設(shè)計(jì)模式的六大原則一...
    四月葡萄閱讀 9,214評(píng)論 1 14
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用猜谚、多...
    MinoyJet閱讀 3,944評(píng)論 1 15
  • 炒栗子似乎一年四季都能吃到败砂。 街道邊的小店里,無論什么時(shí)候都能看到成堆的炒栗子魏铅。小時(shí)候到如今昌犹,從未變過。走近那個(gè)街...
    十六幺閱讀 265評(píng)論 0 0