抽象工厂

它能创建一系列相关的对象, 而无需指定其具体类

适用场景

  • 如果代码需要与多个不同系列的相关产品交互,但是由于无法提前获取相关信息,或者出于对未来扩展性的考虑,不希望代码基于产品的具体类进行构建,在这种情况下,可以使用抽象工厂。

  • 如果有一个基于一组抽象方法的类,且其主要功能因此变得不明确,那么在这种情况下可以考虑使用抽象工厂模式

优/缺点

优点:

  • 可以确保同一工厂生成的产品相互匹配

  • 可以避免客户端和具体产品代码的耦合

  • 单一职责原则。可以将产品生成代码抽取到同一位置,使得代码易于维护。

  • 开闭原则。向应用程序中引入新产品变体时,无需修改客户端代码。

缺点:

  • 由于采用该模式需要向应用中引入众多接口和类,代码可能会比之前更加复杂

对比其他模式

  • 早期都会使用工厂方法模式(较为简单,而且可以更方便地通过子类进行定制),随后演化为使用抽象工厂模式、原型模式或生成器模式(更灵活但更加复杂)

  • 生成器重点关注如何分步生成复杂对象。抽象工厂专门用于生产一系列相关对象。抽象工厂会马上返回产品,生成器则允许你在获取产品前执行一些额外构造步骤

  • 抽象工厂模式通常基于一组工厂方法,但也可以使用原型模式来生成这些类的方法

  • 只需对客户端代码隐藏子系统创建对象的方式时,可以使用抽象工厂来代替外观模式

  • 可以将抽象工厂和桥接模式搭配使用。如果由桥接定义的抽象只能与特定实现合作,这一模式搭配就非常有用。在这种情况下,抽象工厂可以对这些关系进行封装,并且对客户端代码隐藏其复杂性

  • 抽象工厂、生成器和原型都可以用单例模式来实现

实现示例

最后更新于