定义
抽象工厂模式提供了一个接口(抽象工厂类),这个接口能创建一系列相关或相互依赖的对象(拥有相同接口的产品实例),而无需指定它们具体的类;具体的工厂负责实现具体的产品实例。(创建型)
抽象工厂模式与工厂方法模式最大的区别:抽象工厂中每个工厂可以创建多种类的产品;而工厂方法每个工厂只能创建一类
主要作用
允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
适用场景
- 客户端(应用层)不依赖于产品实例如何被创建、实现等细节
- 强调一系列相关的产品(属于同一产品族),一起使用创建对象需要大量重复的代码
- 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
产品族:
一个产品族就是同一大类,但是具体品牌不同;如各种品牌的手机就是一个产品族
模式原理
UML类图
模式组成
组成(角色) | 关系 | 作用 |
---|---|---|
抽象产品族(AbstractProduct) | 抽象产品的父类 | 描述抽象产品的公共接口 |
抽象产品(Product) | 具体产品的父类 | 描述具体产品的公共接口 |
具体产品(Concrete Product) | 抽象产品的子类;工厂类创建的目标类 | 描述生产的具体产品 |
抽象工厂(Creator) | 具体工厂的父类 | 描述具体工厂的公共接口 |
具体工厂(Concrete Creator) | 抽象工厂的子类;被外界调用 | 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例 |
实例
实例背景
- 背景:小成有两间塑料加工厂(A厂仅生产容器类产品;B厂仅生产模具类产品);随着客户需求的变化,A厂所在地的客户需要也模具类产品,B厂所在地的客户也需要容器类产品;
- 冲突:没有资源(资金+租位)在当地分别开设多一家注塑分厂
- 解决方案:在原有的两家塑料厂里增设生产需求的功能,即A厂能生产容器+模具产品;B厂间能生产模具+容器产品。(即抽象工厂模式)
原来的工厂方法是新增实体工厂解决新增产品需求,现在没钱新增实体工厂,就只能使用抽象工厂了。
实现步骤
步骤1、创建抽象工厂类,定义具体工厂的公共接口
1 | abstract class Factory{ |
步骤2、创建抽象产品族(产品族的公共接口),定义具体产品族的公共接口;
1 | abstract class AbstractProduct{ |
步骤3、创建抽象产品类(产品族) ,定义具体产品的公共接口;
1 | //容器产品抽象类 |
步骤4、创建具体产品类(继承抽象产品类), 定义生产的具体产品;
1 | //容器产品A类 |
步骤5、创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法;
1 | //A厂 - 生产模具+容器产品 |
步骤6、客户端通过实例化具体的工厂类,并调用其创建不同目标产品的方法创建不同具体产品类的实例
1 | //生产工作流程 |
优点
- 具体产品在应用层代码隔离,不需要关心创建细节
- 把一个系列的产品族统一到一起创建
缺点
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口,违背了开闭原则
- 增加了系统的抽象性和理解难度
参考:
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/07/designPattern/2020-03-07-abstractFactory/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!