一,工厂模式要解决的问题:
1,当使用继承和多态实现代码和接口的复用时,程序员很难记住需要新实例化的子类的名字XXX,因为在比较复杂的系统中,为了避免命名冲突,取得名字可能都不是很好记忆;
2,程序的扩展和维护变得不好实现;
3,有时程序员不清楚在父类中要实例化哪一个子类,只有在具体的子类中用到的时候才可以知道;
二,对应以上问题工厂模式提供的功能:
1,定义创建对象的接口,将对象 的创建封装起来;
2,将新类的实例化延迟到子类中;
三,对应上述两个功能对应的模式示意图(截取自《C++设计模式》):
1,左图表示将创建对象的过程封装起来。此时该模式像一个真正意义上的工厂,批量生产产品;
2,右图表示将新类的实现延迟到子类中;
四,上面的工厂模式在给出方便的同时,也衍生了一部分问题;
1,如果将每一个对象的创建都封装到类中,那么每当产生一个新对象,程序员就要手动添加新对象到这个类中,这就导致这个类永远不能闭合。
想要解决这个问题我们可以通过创建工厂子类来封装新的对象创建过程,但是这也是以多创建一个类作为代价的;或者可以将产品类作为模板参数,就可以避免产生新的工厂子类。
2,工厂模式只是针对于一类类有显著作用,但是当一组有关联的对象需要被批量生产时,工厂模式还是会给出单独的创建对象的方式,关联对象之间的联系在工厂模式里面没有体现出联系。
五,由上述第二个问题衍生出抽象工厂模式:
1,抽象工厂模式解决的问题是一组相互关联的对象的创建和维护问题;
相应的结构图如下所示(截取自C++设计模式一书):
由上面结构图所示,抽象工厂创建出简单工厂1和2,简单工厂下创建一组相互关联的对象A和B,相对应的对象A的操作实现在抽象类A里面,B的操作实现在抽象类B里面。可以看出,抽象工厂模式实际上是由简单工厂模式实现的。
六,关于工厂模式与抽象工厂模式的代码实现,参见我的github地址:https://github.com/shangruyue