概述
其实回顾一番,发现简单工厂模式和工厂方法模式面对的都是创建同一种产品的过程,但是,如果是创造多个产品,并且产品之间有一些关联的话,那么这两种模式就行不通的。
这里我要学习一个用于多个关联产品创建的新模式:抽象工厂模式,它的 UML 长这样:
可以看到,抽象工厂模式是创建多个产品,并且产品之间不是随便组合的,而是有一些要求的。
示例
这里举例一个场景,假设在开发 GUI 程序的时候,有很多 GUI Framework 可以用,例如 Windows 下的 MFC,还有 Qt 之类的,那么这个 GUI Framework 就是一个 AbstractFactory,因为想象一下,你在开发 GUI 程序的时候,不可能说我先创建一个 MFC 的窗口,然后添加一个 Qt 的 Button 进入,在没有强大黑科技的情况下,这根本就不可能,那么正常的做法肯定是:
- 要么先创建一个 MFC 的 Windows,然后再添加一个 MFC 的 Button
- 或者先创建一个 Qt 的 Windows,然后再添加一个 Qt 的 Button
所以,我的代码可以先这么抽象:
下一步就是创建各自的实现了,首先是 MFC 版本,然后是 Qt 版本:
MFC 版本
Qt 版本
然后我们在用的时候,就根据自己的情况选择一个进行开发:
如果我们用得不爽了,直接更换为 Qt 的,那么这么简单操作就可以了:
非常的方便。
点评
从示例中可以看出,抽象工厂模式可以让客户端无需关心具体产品的创建过程;同时,也可以非常轻松得更换产品族。但是,也正是因为产品都是以产品族的形式存在,所以当我们想在这个产品族中添加新产品的时候,会很麻烦。
同时,抽象工厂模式也保证了系统使用的产品都是同一个产品族的,并且可以让我们很轻松的扩展出一个新的产品族。