Php设计模式之工厂模式(二)【工厂方法模式 Factory Method】

参考网站:http://blog.csdn.net/uuleaf/article/details/7572514

【案例

承接上一篇简单工厂模式。黑枣克隆公司在初始发展阶段使用简单工厂模式来生产克隆狗,狗的分类方式局限于按颜色分类。由于市场需求变化,客户对同一颜色狗有了体型大小要求,分为大型狗及小型狗两类。

分析OOA

如果我是黑枣克隆公司老板,我可能要开设分厂。使用大型狗工厂专门生产大型狗,小型狗工厂专门生产小型狗。其实软件工程师也会去这样实现。工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”。

设计OOD

<UML>


<说明>

1、抽象工厂角色Factory: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。

2、具体工厂角色SmallDogFactoryBigDogFactory:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

3、抽象产品角色Dog:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

4、具体产品角色RedBigDog\RedSmallDog\BlackBigDog\BlackSmallDOg:具体工厂角色所创建的对象就是此角色的实例。

编程 OOP

<代码>

  1. interface Dog  
  2. {  
  3.     public function shout();  
  4. }  
  5.   
  6. class BlackBigDog implements Dog  
  7. {  
  8.     public function shout()  
  9.     {  
  10.         echo "BlackBigDog Wao!Wao!Wao! \n";  
  11.     }  
  12. }  
  13.   
  14. class RedBigDog implements Dog  
  15. {  
  16.     public function shout()  
  17.     {  
  18.         echo "RedBigDog Wao!Wao!Wao! \n";  
  19.     }  
  20. }  
  21. class RedSmallDog implements Dog  
  22. {  
  23.     public function shout()  
  24.     {  
  25.         echo "RedSmallDog Wao!Wao!Wao! \n";  
  26.     }  
  27. }  
  28.   
  29. class BlackSmallDog implements Dog  
  30. {  
  31.     public function shout()  
  32.     {  
  33.         echo "BlackSmallDog Wao!Wao!Wao! \n";  
  34.     }  
  35. }  
  36.   
  37. interface DogFactory  
  38. {  
  39.     public function create($color);  
  40. }  
  41.   
  42. class BigDogFactory implements DogFactory  
  43. {  
  44.     public function create($color)  
  45.     {  
  46.         $dogtype = ucfirst(strtolower($color)) . 'BigDog';  
  47.         if (class_exists($dogtype)) {  
  48.             return new $dogtype();  
  49.         }  
  50.     }  
  51. }  
  52.   
  53. class SmallDogFactory implements DogFactory  
  54. {  
  55.     public function create($color)  
  56.     {  
  57.         $dogtype = ucfirst(strtolower($color)) . 'SmallDog';  
  58.         if (class_exists($dogtype)) {  
  59.             return new $dogtype();  
  60.         }  
  61.     }  
  62. }  

测试用例Test Case

<代码>

  1. class testDriver  
  2. {  
  3.     public function run()  
  4.     {  
  5.         $factory1 = new BigDogFactory();  
  6.         $dog1 = $factory1->create('black');  
  7.         $dog1->shout();  
  8.         $factory2 = new SmallDogFactory();  
  9.         $dog1 = $factory2->create('red');  
  10.         $dog1->shout();  
  11.     }  
  12. }  
  13.   
  14. $test = new testDriver();  
  15. $test->run();  

输出


小结

工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类。

当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。

这里还请注意一下,创建者类与产品的层次结构是非常相似的。在本案例中,大狗厂子只生产大狗,小狗厂子只生产小狗。这是工厂方法模式常见的使用情景,但是这也导致一些代码重复,如狗的子类会太多。工厂方法模式常常和抽象工厂模式一起使用。


********************************************

* 作者:叶文涛 

* 标题:Php设计模式之工厂模式(二)【工厂方法模式 Factory Method】

* 参考:

*  《Head First设计模式》Eric Freeman等著

*《PHP高级程序设计:模式、框架和测试》 Kevin McArthur 著 汪泳 等译

******************转载请注明来源 ***************


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值