抽象工厂模式
概念
工厂方法模式为了解决工厂类责任过重的问题,引入了工厂等级结构。但是工厂方法模式一个Factory类只生产一个产品,这样势必会造成类数目暴涨问题,带来额外系统开销。可以用抽象工厂模式来解决这个问题。
- 定义: 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式为创建一组对象提供了一种解决方案。 结构图如下:
实例
上面的定义和结构图看着可能云里雾里的,直接看代码好了。以我喜欢吃的水果为例子。水果通常分果皮、果肉、果核。吃水果之前我们一般需要判断下哪部分可以吃…
首先建立Factory与Product接口
接着建立ConcreteFactory 与ConcreteProcduct
看下运行结果:
总结
可以看到抽象工厂模式是将一系列有共同特征的对象封装在一起(使用一个工厂来创建),将来系统扩展时也比较方便,有效地减少了程序中的类的数目。
但是也有缺点。就上例而言,假如我们要新增桃子类,写个1个桃子工厂类再写3个产品类就可以,不用修改已有代码,很方便,符合开闭原则。但是如果要新增香蕉类呢,香蕉没果核啊,是不是需要改动一系列接口?这个也是抽象工厂的最大的缺点了。可以说其满足纵向(产品族 )的开闭原则,而不满足横向(产品等级)的开闭原则。具体应用场景视情况而定,不要生搬硬套。
缺点
- 更改产品等级比较麻烦,违反开闭原则
适用场景
- 具体产品在逻辑上属于同一产品族,具有共同约束,比如苹果、梨子都有果肉
- 产品等级比较稳定,不会对已有产品等级进行修改,比如系统需求稳定了,不会让你再往里加香蕉…