抽象工厂模式
抽象工厂模式和简单工厂模式相比之下,抽象工厂用到了简单工厂,是简单工厂的升级版。简单工厂对应的产品是单一层级的,而抽象工厂对应的产品可以是多层级的,或者说产品的类别属性是多维的,比如硬件设备有屏幕和电池,但是屏幕和电池又分型号,这就是类别上的多维,这种情况下的工厂模式,就用到抽象工厂模式。
例如
此处定义产品有四种,P1型号的电池和屏幕以及P2型号的电池和屏幕。然后使用工厂来生产(创建对象)。
仔细想一想,对于一个制造工厂(创建对象),产品是核心。所以在产品的类结构定义上,定义Device接口,Screen抽象类,Battery抽象类,具体的产品是抽象类的实现。
所以产品的类图如下:
product.PNG
那么对应的生产工厂应该什么样子呢?参考网上的一些设计,我有下面两个设计方法:
-
以设备为中心
factory1.PNG -
以型号为中心
factory2.PNG
那么到底应该以哪个为基准呢?
参考网上的示例来对比,以及对号入座“产品族”和“产品层级结构”的概念,开始云雾缭绕的。
那么回到设计模式的本质问题,为什么要用设计模式?是为了代码能被更好维护,更开放的拥抱业务的变化。
那这里使用抽象工厂的目的,也是为了拥抱变化。那么在这里可能变化的是什么呢。如果很有可能后期会增加新的Device,比如CPU,那么第一种工厂能很好的应对变化,只要再添加一个CPU实体类和一个CPUFactory就可以了,原有代码不用修改;如果要添加的是型号,比如要添加P3型号,只要添加P3设备的实现类和新的P3Factory就可以了,不用修改已存在的代码。
这样,才是使用此设计模式的意图吧。