1.3設(shè)計(jì)模式之抽象工廠(Abstract Factory)

1.3.1 模式意圖:

如果業(yè)務(wù)需求創(chuàng)建一系列相同產(chǎn)品簇中的產(chǎn)品,可能會產(chǎn)生創(chuàng)建分支過多闯袒,創(chuàng)建產(chǎn)品遺漏等風(fēng)險。這時使用抽象工廠可以有效避免上述問題游岳,并提高其封裝性政敢,從概念上更符合單一原則。

產(chǎn)品簇(Product family):指具有相同或相似的功能結(jié)構(gòu)或性能胚迫,共享主要的產(chǎn)品特征喷户、組件或子結(jié)構(gòu),并通過變型配置來滿足特定市場的一組產(chǎn)品的聚類访锻。

如圖所示褪尝,谷歌和百度都具有搜索、云計(jì)算期犬、人工智能等相似的結(jié)構(gòu)河哑,這種相似產(chǎn)品結(jié)構(gòu)的集合就是產(chǎn)品簇。原來我們使用的工廠方法主要是產(chǎn)生不同的產(chǎn)品龟虎,如不同的搜索引擎璃谨、云計(jì)算、人工智能鲤妥。所說的抽象工廠佳吞,是產(chǎn)生不同的產(chǎn)品簇,也就是生產(chǎn)谷歌或者百度棉安。

1.3.2 模式概念:

抽象工廠又稱為其他工廠的工廠底扳,它屬于創(chuàng)建型模式。它提供了一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口垂券,而無需指定它們具體的類花盐。

1.3.3 模式元素:

  • 產(chǎn)品抽象(ISearch、ICloudComputing菇爪、IAI)
  • 產(chǎn)品細(xì)節(jié)(GoogleSearch算芯、BaiduSearch 等)
  • 工廠抽象(AbstractFactory)
  • 工廠細(xì)節(jié)(FactoryGoogle、FactoryBaidu)

1.3.4 代碼示例:

接口及產(chǎn)品

public interface ISearch { }
public interface ICloudComputing { }
public interface IAI { }
public class GoogleSearch : ISearch { }
public class GoogleCloudComputing : ICloudComputing { }
public class GoogleAI : IAI { }


public class BaiduSearch : ISearch { }
public class BaiduCloudComputing : ICloudComputing { }
public class BaiduAI : IAI { }

抽象基類類工廠及實(shí)現(xiàn)工廠

public abstract class AbstractFactory
{
    public abstract ISearch CreatSearch();
    public abstract ICloudComputing CreatCloudComputing();
    public abstract IAI CreatSAI();
}


public class FactoryGoogle : AbstractFactory
{
    public override ICloudComputing CreatCloudComputing()
    {
        return new GoogleCloudComputing();
    }

    public override IAI CreatSAI()
    {
        return new GoogleAI();
    }

    public override ISearch CreatSearch()
    {
        return new GoogleSearch();
    }

}


public class FactoryBaidu : AbstractFactory
{
    public override ICloudComputing CreatCloudComputing()
    {
        return new BaiduCloudComputing();
    }

    public override IAI CreatSAI()
    {
        return new BaiduAI();
    }

    public override ISearch CreatSearch()
    {
        return new BaiduSearch();
    }
}

1.3.5 寫法運(yùn)用:

    public void TestAbstractFactory()
    {
        AbstractFactory googleFactory = new FactoryGoogle();
        googleFactory.CreatCloudComputing();
        googleFactory.CreatSAI();
        googleFactory.CreatSearch();

        AbstractFactory baiduFactory = new FactoryGoogle();
        baiduFactory.CreatCloudComputing();
        baiduFactory.CreatSAI();
        baiduFactory.CreatSearch();
    }

1.3.6 模式分析:

抽象工廠最大的好處就是可以批量生產(chǎn)不同產(chǎn)品的替換和組合

  • 【批量生產(chǎn)】如示例所示凳宙,生產(chǎn)搜索熙揍、云計(jì)算、人工智能產(chǎn)品不需要分別創(chuàng)建不同的工廠氏涩,一個工廠全部搞定届囚。
  • 【不同產(chǎn)品的替換和組合】如果在項(xiàng)目中后續(xù)需求是一個混合產(chǎn)品有梆,例如百度的搜索搭配谷歌的AI和云計(jì)算,又或者百度的搜索意系,谷歌的AI和阿里的云計(jì)算泥耀,我們只需要新建一個混合工廠,然后添加阿里的云計(jì)算即可蛔添,原來的“產(chǎn)品”都可以復(fù)用痰催。

不足之處:

  • 如果結(jié)構(gòu)更改(基類更改),那么所有實(shí)現(xiàn)的工廠都需要更改迎瞧,這種變動是很難讓人接受的夸溶。
  • 產(chǎn)品搭配的靈活性低于工廠方法

1.3.7 應(yīng)用場景:

需要創(chuàng)建一系列相同產(chǎn)品簇的對象,以便進(jìn)行聯(lián)合使用時凶硅。

1.3.8 小結(jié):

  • 工廠模式主要是面向產(chǎn)品的創(chuàng)建缝裁,把創(chuàng)建由上層的業(yè)務(wù)邏輯轉(zhuǎn)移到下層。
  • 簡單工廠簡單粗暴足绅,switch..case輕松劃分捷绑。
  • 工廠方法靈活多用,增增減減利于維護(hù)氢妈。
  • 抽象工廠批量生產(chǎn)胎食,產(chǎn)品搭配還不浪費(fèi)。

注:工廠三姐妹 ——簡單工廠允懂、工廠方法 和 抽象工廠,按照你的需求選擇適合的工廠模式衩匣。


更多設(shè)計(jì)模式詳見:設(shè)計(jì)模式全家桶

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蕾总,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子琅捏,更是在濱河造成了極大的恐慌生百,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柄延,死亡現(xiàn)場離奇詭異蚀浆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)搜吧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門市俊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滤奈,你說我怎么就攤上這事摆昧。” “怎么了蜒程?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵绅你,是天一觀的道長伺帘。 經(jīng)常有香客問我,道長忌锯,這世上最難降的妖魔是什么伪嫁? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮偶垮,結(jié)果婚禮上张咳,老公的妹妹穿的比我還像新娘。我一直安慰自己针史,他們只是感情好晶伦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啄枕,像睡著了一般婚陪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上频祝,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天泌参,我揣著相機(jī)與錄音,去河邊找鬼常空。 笑死沽一,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漓糙。 我是一名探鬼主播铣缠,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昆禽!你這毒婦竟也來了蝗蛙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤醉鳖,失蹤者是張志新(化名)和其女友劉穎捡硅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盗棵,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壮韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纹因。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喷屋。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞭恰,靈堂內(nèi)的尸體忽然破棺而出逼蒙,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布是牢,位于F島的核電站僵井,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驳棱。R本人自食惡果不足惜批什,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望社搅。 院中可真熱鬧驻债,春花似錦、人聲如沸形葬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笙以。三九已至淌实,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猖腕,已是汗流浹背拆祈。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倘感,地道東北人放坏。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像老玛,于是被迫代替她去往敵國和親淤年。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

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

  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時需要注意以下幾點(diǎn):a) 高內(nèi)聚蜡豹、低耦合和單一職能的“沖突”實(shí)際上互亮,這兩者...
    彥幀閱讀 3,747評論 0 14
  • 0.提前說明 模式選擇的方法1)模式的功能——看是否能解決問題2)模式的本質(zhì)——看模式是否主要用來解決這類問題3)...
    王偵閱讀 1,053評論 0 1
  • 前言 關(guān)于設(shè)計(jì)模式,是一個永遠(yuǎn)說不完的也說不清的話題余素。畢竟在編程的世界里,沒有最好的設(shè)計(jì)模式炊昆,只有最合適的設(shè)計(jì)模式...
    VV木公子閱讀 1,490評論 0 9
  • 1 場景問題# 1.1 選擇組裝電腦的配件## 舉個生活中常見的例子——組裝電腦桨吊,我們在組裝電腦的時候,通常需要選...
    七寸知架構(gòu)閱讀 4,338評論 6 67
  • 目標(biāo):1凤巨、希望孩子擁有更多朋友更加開心快樂视乐!智慧多多!不計(jì)較敢茁!不抱怨佑淀!能夠心平氣和的說話!不著急彰檬!不上火伸刃!我倆不干...
    zl向日葵閱讀 155評論 0 0