在设计模式中的创建者模式中有三中模式可以说是同根同源。它们就是简单工厂模式、工厂模式、抽象工厂模式。下面我们逐一看它们的特点以及异同。
1、简单工厂模式
简单工厂模式并不在GoF的23种设计模式之列,不过它却是工厂模式和抽象工厂模式最简化的一种表现形式。它通过一个工厂类Factory来根据传入的参数决定构建具体哪一类产品的实例。它屏蔽了客户端创建具体产品实例的过程,提供给客户端可用的对象。但是它有一个致命的缺点就是Factory中的逻辑比较负责,要根据参数去判断生成怎么样的产品实例给客户端。特别是产品实例动态的增加的时候,你必须要修改Factory的判断逻辑,这一点违背了“开-闭原则”。可能这也是它未能入选23种设计模式的原因吧。
上uml图吧,这样更易于理解(图来源于百度百科)
2、工厂模式
如果说什么模式应用最多,个人认为就是工厂模式了。例如想Spring中Factory,Bean实在是太常见了。你自己平时写程序,new一个对象也是非常常见的,所以工厂模式常见也是非常正常。如果要说工厂模式和抽象工厂模式的区别,那就要先看抽象工厂的缺点了,违背了“开-闭”原则。所以工厂模式,就作出了改进,每一个Product都有一个自己对应的工厂。当然这些工厂都继承于抽象工厂类,并实现了工厂方法。
上uml图吧,自己可以对比一下,图片来源于大话设计模式
3、抽象工厂模式
看了上面的工厂模式,你是不是会觉得很爽,因为大部分new出来的对象都可以用工厂去产生,确实,在Spring中,所有的类成员变量都是配置文件配进去的,也就是通过工厂产生的。但是你会发现一个问题,如果是一个工厂只产生一个bean,那么如果我想产生一组bean怎么办呢?因为很多时候某一组bean是捆绑在一起的。例如db中,sqlServer,mysql,oracle各自对应一组Connection, resultSet等,那是你这个时候就需要抽象工厂了,它提供了这样对一组or一类bean区分的需求的支持。
上uml图吧,偶觉得有图有真相,呵呵。图片仍旧来自大话设计模式。
4、总结
通过上面的介绍和图例,基本可以看出三种工厂模式的特点和异同。主要是它们的不同点,简单工厂封装了构建对象的过程,但内部存在判断逻辑,所以违背了“开-闭”原则。工厂模式通过对每一个product增加一个工厂去增加弥补这个缺点。但是工厂模式又不能生成同一类型的多个product,所以抽象工厂模式通过增加多个工厂方法去解决这个问题。
最后附上文档的pdf吧。呵呵,希望对设计模式初学者有用。
/Files/zhenxuanpan/设计模式之三种工厂.pdf