前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。如果你也经常遇到这种问题,就说明你现阶段非常需要学习下设计模式了。
在网上经常说的设计模式有23种,也有一些更多的设计模式,无非也是从这些设计模式中变种而来。如果让笔者来形容什么是设计模式,我认为设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略。
举个生活中的列子:你需要从家去公园,虽然都是从A点到B点,但目的是着急取东西,你会用代步工具快速到达,但如果仅仅是打发时间,完全可以散步去。用代步工具和散步本身没有绝对的对错,只是根据当时的需求采取的策略。设计模式这种思想,就是根据你当时的需求给你提供最高效的策略。
有说的不正确或者不准确的地方欢迎留言指正
有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力
今天笔者为大家介绍工厂三姐妹中的最后一种------【抽象工厂】
在这之前,先给大家介绍一个概念,产品簇,她是这样定义的:产品簇(Product family)指具有相同或相似的功能结构或性能,共享主要的产品特征、组件或子结构,并通过变型配置来满足特定市场的一组产品的聚类。
这么说大家可能不是很好理解,那么举个栗子,如下图
看下图~~~
单从上图例子所示,谷歌和百度都具有搜索、云计算、人工智能等相似的结构,这种相似产品结构的集合就是产品簇。原来我们使用的工厂方法主要是产生不同的产品,如不同的搜索引擎,不同的云计算。不同的人工智能。今天说的抽象工厂,是产生不同的产品簇,也就是生产谷歌或者百度。
示例代码如下
接口及产品
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 { }
抽象基类类工厂及实现工厂
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();
}
}
使用方式如下
public void TestAbstractFactory()
{
AbstractFactory googleFactory = new FactoryGoogle();
googleFactory.CreatCloudComputing();
googleFactory.CreatSAI();
googleFactory.CreatSearch();
AbstractFactory baiduFactory = new FactoryGoogle();
baiduFactory.CreatCloudComputing();
baiduFactory.CreatSAI();
baiduFactory.CreatSearch();
}
抽象工厂最大的好处就是可以批量生产和不同产品的替换和组合
- 【批量生产】如示例所示,生产搜索、云计算、人工智能产品不需要分别创建不同的工厂,一个工厂全部搞定
- 【不同产品的替换和组合】如果在项目中我们的后续需求是需要一个混合产品,例如百度的搜索搭配谷歌的AI和云计算,又或者需要百度的索索,谷歌的AI和阿里的云计算,我们只需要新建一个混合工厂,然后添加阿里的云计算即可,原来的“产品”都可以复用。
当然,有优点也就有缺点
- 如果结构更改(抽象工厂基类更改),那么所有实现的工厂都需要更改,这种变动是很难让人接受的
- 灵活性也没有工厂方法灵活,想用哪个产品就用哪个产品
抽象工厂模式,(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
总结
- 工厂模式主要是面向产品的创建,把创建由上层的业务逻辑转移到下层
- 简单工厂简单粗暴,switch..case轻松划分
- 工厂方法灵活多用,增增减减利于维护
- 抽象工厂批量生产,产品搭配还不浪费