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)單工廠、工廠方法 和 抽象工廠,按照你的需求選擇適合的工廠模式。