此前讲解过简单工厂模式和工厂模式,这一篇我们来学习工厂系列的最后一个模式抽象工厂模式。关于这两个模式,不明白的可以查看我的博客:http://liuwangshu.cn。
抽象工厂模式可以说是是工厂方法模式的升级版,当需要创建的产品有多个产品线(产品族)时使用抽象工厂模式是比较好的选择。那什么是多个产品线呢?拿我们在简单工厂模式以及工厂方法模式中学习的生产电脑的例子来举例,我们一直都是生产联想和惠普的电脑,但是电脑也有多个产品线:台式机、笔记本和平板等等,联想和惠普都在生产这些不同产品线上的电脑,使用工厂方法模式已经满足不了需求,这一篇文章我们就用抽象工厂模式来解决这一问题。
抽象工厂模式定义 为创建一组相关或者相互依赖的对象提供一个接口,而无需指定它们的具体类。
抽象工厂模式UML图
在抽象工厂模式中有如下角色: - AbstractFactory:抽象工厂,它声明了用来创建不同产品的方法。 - ConcreteFactory:具体工厂,实现抽象工厂中定义的创建产品的方法。 - AbstractProduct:抽象产品,为每种产品声明业务方法。比如上图的AbstractProductA和 AbstractProductB。 - ConcreteProduct:具体产品,定义具体工厂生产的具体产品,并实现抽象产品中定义的业务方法。
联想和惠普生产的电脑分为了两个产品线,一个台式机,一个是笔记本。为了解决增加产品线的问题,我们用抽象工厂模式来进行实现。
抽象产品 首先定义抽象产品类:
两个抽象产品类分别为DesktopComputer和NotebookComputer ,用来定义两个产品线:台式机和笔记本。它们都定义了start方法,用来启动电脑。 具体产品 具体产品为联想和惠普旗下的台式机和笔记本,如下所示。
抽象工厂 接着创建生产电脑的抽象工厂,如下所示。
定义了两个方法,分别用来生产台式电脑和笔记本电脑。
具体工厂 定义联想和惠普工厂:
联想工厂和惠普工厂用来生产台式机和笔记本这两个不同产品线的电脑。
客户端调用 最后编写客户端:
分别用LenovoFactory和HpFactory生产台式和笔记本电脑,并调用start方法启动它们。 运行结果为: 联想台式电脑启动 联想笔记本电脑启动 惠普台式电脑启动 惠普笔记本电脑启动
接下来给出这个例子的UML图,更便于理解,如下所示。
优点 具体类的创建实例过程与客户端分离,客户端通过工厂的抽象接口操纵实例,客户端并不知道具体的实现是谁。
缺点 如果增加新的产品族则也需要修改抽象工厂和所有的具体工厂。
参考资料 《大话设计模式》 《设计模式之禅》 《Android源码设计模式》