六个创建模式之抽象工厂模式(Abstract Factory Pattern)

时间:2023-03-08 22:34:46

问题:

使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护。因此可以考虑使用一个工厂创建一个产品族。

定义:

提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品家族。

结构图:

六个创建模式之抽象工厂模式(Abstract Factory Pattern)

  • AbstractProduct:抽象产品类,抽象工厂模式中至少含有一个抽象产品类,每个抽象产品类派生出一个产品结构,定义了该产品结构中所有派生类的公开方法,方便于该产品的扩展。
  • ConcreteProduct:具体产品类,抽象工厂模式中含有多种具体产品类,实现其对应的抽象产品类定义的方法。
  • Factory:抽象工厂类,声明了一组用于创建一个产品家族的方法。
  • ConcreteFactory:具体工厂类,每个工厂不在仅仅创建一个产品,而是由抽象工厂类定义的创建多个产品。

产品等级结构与产品族

  • 产品等级结构即是产品的继承结构,具体产品类都派生自抽象产品类,抽象产品类在顶层。
  • 产品族是由一个工厂生产的,位于不同产品等级结构的一组产品。

    六个创建模式之抽象工厂模式(Abstract Factory Pattern)

注意:

  • 工厂方法可以看做特殊情况下的抽象工厂,即只含有一个产品结构,每个产品族只有一个产品。
  • 抽象工厂模式的“开闭原则”具有倾斜性。对于加入一个产品族,是十分方便的,仅需要添加对应的具体产品类和一个具体具体工厂列。但是对于加入一个产品结构,则需要修改所有的工厂类,无法方便扩展。

优点:

  • 隔离了类的具体实现,并隐藏了一个产品家族中产品的关联关系。如果要更换一个产品家族,只要更换到对应的具体工厂上。
  • 当一个产品家族被设计成一起工作时,对应的工厂类可以做保证。
  • 增加一个新的产品族十分方便,无需修改已有系统源码,符合“开闭原则”。

缺点:

  • 无法增加新的产品等级结构,需要对原有代码进行较大的修改,甚至修改抽象层代码。

适用场景:

  • 产品类型较多且与其它产品有一定的组合或关联关系,但用户无需关心对象创建过程。
  • 系统中有多个产品族,且每次只使用一个产品族,可以通过配置文件等方式使用户可以动态地改变产品族。
  • 产品等级结构稳定,在设计完成后不会出现新增产品等级结构的情况。

实例:

六个创建模式之抽象工厂模式(Abstract Factory Pattern)

AbstractFactoryPattern.java