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

1.3.1 模式意圖:

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

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

如圖所示,谷歌和百度都具有搜索、云計(jì)算、人工智能等相似的結(jié)構(gòu),這種相似產(chǎn)品結(jié)構(gòu)的集合就是產(chǎn)品簇。原來(lái)我們使用的工廠方法主要是產(chǎn)生不同的產(chǎn)品,如不同的搜索引擎、云計(jì)算、人工智能。所說(shuō)的抽象工廠,是產(chǎn)生不同的產(chǎn)品簇,也就是生產(chǎn)谷歌或者百度。

1.3.2 模式概念:

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

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 寫(xiě)法運(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)建不同的工廠,一個(gè)工廠全部搞定。
  • 【不同產(chǎn)品的替換和組合】如果在項(xiàng)目中后續(xù)需求是一個(gè)混合產(chǎn)品,例如百度的搜索搭配谷歌的AI和云計(jì)算,又或者百度的搜索,谷歌的AI和阿里的云計(jì)算,我們只需要新建一個(gè)混合工廠,然后添加阿里的云計(jì)算即可,原來(lái)的“產(chǎn)品”都可以復(fù)用。

不足之處:

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

1.3.7 應(yīng)用場(chǎng)景:

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

1.3.8 小結(jié):

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

注:工廠三姐妹 ——簡(jiǎn)單工廠工廠方法 和 抽象工廠,按照你的需求選擇適合的工廠模式。


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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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