目录
意图
- 提供用于创建相关或依赖对象系列的接口,而无需指定它们的具体类。
- 封装的层次结构:许多可能的“平台”,以及一套“产品”的构建。
new
运营商认为有害。
问题
如果一个应用程序是可移植的,它需要封装平台依赖。这些“平台”可能包括:窗口系统、操作系统、数据库等。很多时候,这种封装不是预先设计好的,并且许多#ifdef
带有所有当前支持平台的选项的案例语句开始像兔子一样在整个代码中繁殖。
讨论
提供一个间接级别,抽象相关或依赖对象系列的创建,而无需直接指定它们的具体类。“工厂”对象负责为整个平台家族提供创建服务。客户从不直接创建平台对象,他们要求工厂为他们这样做。
这种机制使产品系列的交换变得容易,因为工厂对象的特定类在应用程序中只出现一次——它被实例化的地方。该应用程序可以简单地通过实例化抽象工厂的不同具体实例来批量替换整个产品系列。
因为工厂对象提供的服务是如此普遍,所以它通常被实现为单例。
结构
抽象工厂为每个产品定义了一个工厂方法。每个工厂方法都封装了new
操作符和具体的、特定于平台的产品类。然后使用工厂派生类对每个“平台”进行建模。

例子
抽象工厂的目的是提供一个用于创建相关对象系列的接口,而无需指定具体的类。这种模式在日本汽车制造中使用的钣金冲压设备中发现。冲压设备是制造汽车车身零件的抽象工厂。相同的机械用于冲压不同型号汽车的右手门、左手门、右前挡泥板、左前挡泥板、引擎盖等。通过使用滚轮更换冲压模具,可以在三分钟内更换机器生产的混凝土等级。

检查清单
- 确定“平台独立性”和创建服务是否是当前的痛点。
- 绘制“平台”与“产品”的矩阵。
- 定义一个由每个产品的工厂方法组成的工厂接口。
- 为每个平台定义一个工厂派生类,该类封装了对
new
操作符的所有引用。 - 客户端应该撤销对 的所有引用
new
,并使用工厂方法来创建产品对象。
经验法则
- 有时,创建模式是竞争对手:在某些情况下,原型或抽象工厂都可以有利可图。在其他时候它们是互补的:抽象工厂可能存储一组原型,从中克隆和返回产品对象,构建器可以使用其他模式之一来实现构建哪些组件。Abstract Factory、Builder 和 Prototype 可以在它们的实现中使用 Singleton。
- Abstract Factory、Builder和Prototype定义了一个工厂对象,负责了解和创建产品对象的类,并使其成为系统的参数。抽象工厂具有生产多个类对象的工厂对象。Builder 让工厂对象使用相应复杂的协议逐步构建复杂的产品。Prototype 具有通过复制原型对象来构建产品的工厂对象(又名原型)。
- 抽象工厂类通常使用工厂方法实现,但也可以使用原型实现。
- Abstract Factory 可以用作 Facade 的替代方法来隐藏特定于平台的类。
- Builder专注于一步一步地构建一个复杂的对象。抽象工厂强调一系列产品对象(简单或复杂)。Builder 作为最后一步返回产品,但就抽象工厂而言,产品会立即返回。
- 通常,设计从使用工厂方法(不太复杂、更可定制、子类激增)开始,然后随着设计人员发现需要更多灵活性的地方而向抽象工厂、原型或构建器(更灵活、更复杂)发展。
本文来自转载,原文链接: