1.意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,
2.别名
Kit
3.动机
我的工厂需要生产的产品是一系列的对象,而不是一个单一的对象时需要抽象工厂来解决。
首先我们先来了解俩个概念
1)产品等级结构:即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
2) 产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
产品族与产品等级结构示意图见如下:
举一个例子
抽象工厂是为了一个产品族而进行生产的
4.适用性
在以下情况使用Abstract Factory模式
- 一个系统要独立于它的产品的创建,组合,表示时。
- 一个系统要由多个产品系列中的一个来配置。
- 当你要强调一系列相关产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库时,而只想显示他们的接口而不是实现时。
5.结构
6.参与者
- AbstractFactory 声明一个创建抽象产品对象的操作接口
- ConcreteFactory 实现创建具体产品对象的操作
- AbstractProduct 为一类产品对象声明一个接口
- ConcretePrduct 定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct接口
- Client 仅使用有AbstractFacotory和AbstractProduct类声明的接口。
7.协作
通常在运行时创建一个ConcreteFactory类的实例。来创建特定的产品对象。创建不同的对象要用不同的工厂。
8.效果
- 它分离了具体的类。你只需要控制创建对象的类,用它来创建对应的你需要的产品,而不需要知道它是怎么创建的。
- 它使得易于交换产品系列。在更换一系列产品时,只需要改变具体的工厂就可以改变,
- 它有利于产品的一致性。它可以保证使用应用的时候使用的是一个系列的产品来协调工作
- 难以支持新种类的产品。