下面这篇帖子总结的很好
简单工厂,工厂方法和抽象工厂的区别总结:http://blog.csdn.net/johnkai/archive/2010/05/05/5559209.aspx
简单工厂:严格说并不是一个设计模式。简单工厂没有抽象类,只有一个具体工厂类如MyFactory,然后MyFactory里面有个工厂方法CreateProduct返回一个基类产品,具体返回什么具体实例通过传入参数然后用case判断。
比如Nokia简单工厂就是只有NokiaFactory工厂类,工厂方法就是CreateNokiaPhone,参数是Nokia手机型号,根据不同型号创建不同的Nokia手机(使用case)。很明显的缺点就是Nokia每发明一个新型号的手机都需要修改简单工厂类(增加case判断),违反了封闭修改,开放扩展原则。
public Class NokiaFactory
工厂方法:该模式有一个抽象基类和若干个派生的具体工厂类,基类定义了一个虚工厂方法返回指定产品类的基类,派生类需要实现该虚方法并创建具体产品类返回。注意工厂方法的每个具体工厂只负责返回一种产品类
抽象工厂:该模式和工厂方法模式很相似,也是一个抽象基类和若干个具体工厂类,不同的是抽象工厂的工厂基类定义了多个虚工厂方法,每个虚工厂方法负责返回一种产品,多个工厂方法返回多种产品,并且这些产品具有某些联系。
用最简单的话来概括就是,简单工厂只有一个具体工厂类来创建一种基类的多个不同派生类,工厂方法就是有多个派生于一个基类的具体工厂类,每个具体工厂只生产一种基类的一个派生类,抽象工厂也是只有一个工厂基类,但是每个具体工厂生产多个相关基类的各一个派生类。
看了很多帖子,再做一点心得体会:
1)有很多人说用反射技术来克服简单工厂的条件判断语句带来的耦合问题。是个好主意。
2)在客户端调用端,工厂方法和抽象工厂也不能完全做到开闭原则,只是说修改的代码相对很少而已。
- //如果业务需求是这样子,需要调用多个同样类型的女友
- DreamGirl girl1= new DreamGirlCreatFactory().creatDreamGirl(BeautifulGirl);
- girl1.can_do_something_for_boy();
- DreamGirl girl2= new DreamGirlCreatFactory().creatDreamGirl(BeautifulGirl);
- girl2.can_do_something_for_boy();
- DreamGirl girl3= new DreamGirlCreatFactory().creatDreamGirl(BeautifulGirl);
- gir3.can_do_something_for_boy();
- GirlFactory girlFactory = new BeautifulGirlFactory();
- DreamGirl girl1 = girlFactory.creatDreamGirl();
- DreamGirl girl2 = girlFactory.creatDreamGirl();
- DreamGirl girl3 = girlFactory.creatDreamGirl();
- girl1.can_do_something_for_boy() ;
- girl2.can_do_something_for_boy() ;
- gir3.can_do_something_for_boy() ;
现在我们要将BeautifulGirl 改成SensibleGirl 那么客户端只需要改
GirlFactory girlFactory = new SensibleGirlFactory();就ok了
关键还是看需求选用不同的方法