抽象工厂模式(Abstract Factory)


1、模式概述

抽象工厂模式为一组相关或相互依赖的对象创建提供接口,而无需指定其具体实现类。抽象工厂的客户端不关心如何创建这些对象,只关心如何将它们组合到一起。

2、问题引出

举个例子,如果某个应用是可移植的,那么它需要封装平台依赖,这些平台可能包括窗口系统、操作系统、数据库等等。这种封装如果未经设计,通常代码会包含多个 if 条件语句以及对应平台的操作。这种硬编码不仅可读性差,而且扩展性也不好。

3、解决方案

提供一个间接的层(即“抽象工厂”)抽象一组相关或依赖对象的创建而不是直接指定具体实现类。该“工厂”对象的职责是为不同平台提供创建服务。客户端不需要直接创建平台对象,而是让工厂去做这件事。

这种机制让替换平台变得简单,因为抽象工厂的具体实现类只有在实例化的时候才出现,如果要替换的话只需要在实例化的时候指定具体实现类即可。

4、UML类图

抽象工厂为每个产品(具体实现)定义了工厂方法,每个工厂方法封装了new操作符和具体类(指定平台的产品类),每个“平台”都是抽象工厂的派生类。

抽象工厂模式UML类图

5、代码实现

AbstractFactory.php

JsonFactory.php

HtmlFactory.php

MediaInterface.php

Picture.php

Text.php

Json/Picture.php

Json/Text.php

Html/Picture.php

Html/Text.php

6、测试代码

Tests/AbstractFactoryTest.php

执行测试:

7、总结

最后我们以工厂生产产品为例,所谓抽象工厂模式就是我们的抽象工厂约定了可以生产的产品,这些产品都包含多种规格,然后我们可以从抽象工厂为每一种规格派生出具体工厂类,然后让这些具体工厂类生产具体的产品。以上示例中AbstractFactory是抽象工厂,JsonFactoryHtmlFactory是具体工厂,Html\PictureHtml\TextJson\PictureJson\Text都是具体产品,客户端需要HTML格式的Text,调用HtmlFactorycreateText方法即可,而不必关心其实现逻辑。


<< 上一篇: 概述及目录索引

>> 下一篇: 建造者模式(Builder)