六个创建模式之抽象工厂模式(Abstract Factory Pattern)
问题:
使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护。因此可以考虑使用一个工厂创建一个产品族。
定义:
提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品家族。
结构图:
- AbstractProduct:抽象产品类,抽象工厂模式中至少含有一个抽象产品类,每个抽象产品类派生出一个产品结构,定义了该产品结构中所有派生类的公开方法,方便于该产品的扩展。
- ConcreteProduct:具体产品类,抽象工厂模式中含有多种具体产品类,实现其对应的抽象产品类定义的方法。
- Factory:抽象工厂类,声明了一组用于创建一个产品家族的方法。
- ConcreteFactory:具体工厂类,每个工厂不在仅仅创建一个产品,而是由抽象工厂类定义的创建多个产品。
产品等级结构与产品族
- 产品等级结构即是产品的继承结构,具体产品类都派生自抽象产品类,抽象产品类在顶层。
- 产品族是由一个工厂生产的,位于不同产品等级结构的一组产品。
注意:
- 工厂方法可以看做特殊情况下的抽象工厂,即只含有一个产品结构,每个产品族只有一个产品。
- 抽象工厂模式的“开闭原则”具有倾斜性。对于加入一个产品族,是十分方便的,仅需要添加对应的具体产品类和一个具体具体工厂列。但是对于加入一个产品结构,则需要修改所有的工厂类,无法方便扩展。
优点:
- 隔离了类的具体实现,并隐藏了一个产品家族中产品的关联关系。如果要更换一个产品家族,只要更换到对应的具体工厂上。
- 当一个产品家族被设计成一起工作时,对应的工厂类可以做保证。
- 增加一个新的产品族十分方便,无需修改已有系统源码,符合“开闭原则”。
缺点:
- 无法增加新的产品等级结构,需要对原有代码进行较大的修改,甚至修改抽象层代码。
适用场景:
- 产品类型较多且与其它产品有一定的组合或关联关系,但用户无需关心对象创建过程。
- 系统中有多个产品族,且每次只使用一个产品族,可以通过配置文件等方式使用户可以动态地改变产品族。
- 产品等级结构稳定,在设计完成后不会出现新增产品等级结构的情况。
实例: