工厂方法和抽象工厂方法

下面这篇帖子总结的很好

简单工厂,工厂方法和抽象工厂的区别总结: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)在客户端调用端,工厂方法和抽象工厂也不能完全做到开闭原则,只是说修改的代码相对很少而已。

 

 

 

  1. //如果业务需求是这样子,需要调用多个同样类型的女友   
  2.  
  3. DreamGirl girl1=  new  DreamGirlCreatFactory().creatDreamGirl(BeautifulGirl);   
  4.   
  5. girl1.can_do_something_for_boy();      
  6.   
  7.   
  8.  DreamGirl girl2=  new  DreamGirlCreatFactory().creatDreamGirl(BeautifulGirl);   
  9.   
  10. girl2.can_do_something_for_boy();    
  11.   
  12.   
  13.   
  14. DreamGirl girl3=  new  DreamGirlCreatFactory().creatDreamGirl(BeautifulGirl);   
  15.   
  16. gir3.can_do_something_for_boy();   

 

 

  1. GirlFactory girlFactory = new BeautifulGirlFactory();   
  2.   
  3. DreamGirl  girl1 = girlFactory.creatDreamGirl();      
  4. DreamGirl  girl2 = girlFactory.creatDreamGirl();     
  5. DreamGirl  girl3 = girlFactory.creatDreamGirl();     
  6.   
  7. girl1.can_do_something_for_boy() ;   
  8. girl2.can_do_something_for_boy() ;   
  9. gir3.can_do_something_for_boy() ; 

 现在我们要将BeautifulGirl 改成SensibleGirl 那么客户端只需要改
GirlFactory girlFactory = new SensibleGirlFactory();就ok了

关键还是看需求选用不同的方法

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值