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)。