本文基于整理综合下面两文,深表感谢:
1)设计模式精解-GoF 23 种设计模式解析附 C++实现源码 http://ccftp.scu.edu.cn:8090/Download/038c70a8-c724-4b86-91c3-74b927b1d492.pdf
2)设计模式C++实现(1)---工厂模式 http://blog.youkuaiyun.com/wuzhekai1985/article/details/6660462
工厂模式要解决的问题:
避免过多的使用new XX,因为客户程序员不一定知道子类的名称,而且有时候父类不知道要创建哪个子类的对象。
解决方法:
定义创建对象的接口,封装对象的创建;把创建对象的工作留到子类中。
所谓工厂就是
一个用来创建其他对象的对象
工厂模式有三种:
1)简单工厂模式
2)工厂方法模式
3)抽象工厂模式
1)简单工厂模式:
主要特点是需要在工厂类中做判断,判断创建哪个产品类的对象。
好处是真的很好理解,就像switch case一样;
坏处是每次要增加一种产品的时候(要增加case),就要改动工厂类的代码。
UML:
案例:
有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核。客户需要什么样的处理器核,一定要显示地告诉生产工厂。
对照UML,SingleCore是产品类Product,SingleCoreA和SingleCoreB分别是ConcreteProduct1和ConcreteProduct2两种产品,继承于SingleCore类。
工厂类Factory需要直接知道哪一种产品对象将被创建,用if else判断。
这样设计的主要缺点是要增加新的核类型(产品)时,就需要修改工厂类。这就违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。
2)工厂方法模式
工厂方法模式的出现就是要克服简单工厂模式的缺点:在增加产品种类时要修改工厂类的实现。
主要特点是定义一个用于创建对象的工厂接口,然后让工厂子类来创建哪一种产品,也就是把创建产品子类对象的任务推给了工厂子类。
UML:
案例:
还是以刚才的例子解释。这家生产处理器核的产家赚了不少钱,于是决定再开设一个工厂专门用来生产B型号的单核,而原来的工厂专门用来生产A型号的单核。这时,客户要做的是找好工厂,比如要A型号的核,就找A工厂要;否则找B工厂要,不再需要告诉工厂具体要什么型号的处理器核了。
UML和代码不是很配(甚至有点错了的感觉。。。),但是意思就是,现在每个工厂子类的对象只负责创建一种产品子类的对象。
好处是现在如果要增加新的产品子类,只需要创建一个新的工厂子类来负责创建它即可,而不需要改动工厂类的实现了。
缺点就是每增加一种产品,就需要定义一个工厂子类,所以会有很多的类要被定义。
3)抽象工厂模式
有了工厂方法模式还不够,有时候我们需要创建一组相关的产品对象,而不仅仅像是工厂方法模式里那样只是创建一个产品对象。
所以我们要扩展工厂方法模式为抽象工厂模式,使得每个工厂子类可以创建多个相关产品子类的对象。
UML:
案例:
这个工厂开始生产多核处理器了,也是A、B两种类型,和同型号的单核处理器放在一家工厂生产。
即这家公司还是开设两个工厂,一个专门用来生产A型号的单核多核处理器,而另一个工厂专门用来生产B型号的单核多核处理器。
可以看出,抽象工厂模式和工厂方法模式的主要区别就是前者可以创建一组相关的产品对象,而后者只能创建一个产品对象。
最后
总结:
其实我个人觉得,设计模式这东西,认识到他的好处的前提是,读者认可了软件工程和管理学的一些理念。
也就是说,价值观要符合。