抽象工厂是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
抽象工厂定义了用于创建不同产品的接口, 但将实际的创建工作留给了具体工厂类。 每个工厂类型都对应一个特定的产品变体。
在创建产品时, 客户端代码调用的是工厂对象的构建方法, 而不是直接调用构造函数 ( new
操作符)。 由于一个工厂对应一种产品变体, 因此它创建的所有产品都可相互兼容。
客户端代码仅通过其抽象接口与工厂和产品进行交互。 该接口允许同一客户端代码与不同产品进行交互。 你只需创建一个具体工厂类并将其传递给客户端代码即可。
如果你不清楚工厂、 工厂方法和抽象工厂模式之间的区别, 请参阅工厂模式比较。
概念示例
本例说明了抽象工厂设计模式的结构并重点回答了下面的问题:
- 它由哪些类组成?
- 这些类扮演了哪些角色?
- 模式中的各元素会以何种方式相互关联?
了解该模式的结构后, 你可以更容易地理解下面的基于实际情况的 PHP 应用案例。
index.php: 概念示例
Output.txt: 执行结果
真实世界示例
本例中, 抽象工厂模式提供了一个框架, 以为网页中的各种元素创建不同类型的模板。
只要网络应用的类独立于具体的渲染引擎类, 它就能同时支持不同的渲染引擎。 因此, 应用的对象仅能通过模板对象的抽象接口与其进行互动。 你的代码不能直接创建模板对象, 而是应该将创建行为委派给特殊的工厂对象。 最后, 你的代码也不能依赖于工厂对象, 而是应该通过抽象工厂接口与其进行交互。
你将能为应用中的每个渲染引擎提供相应的工厂对象。 应用中的所有模板都将由该工厂创建, 而且模板与工厂的类型相匹配。 如果你决定更改渲染引擎, 可将一个新的工厂对象传递给客户端代码, 无需对已有代码进行任何修改。
index.php: 真实世界示例
Output.txt: 执行结果