Php设计模式之工厂模式(三)【抽象工厂模式 AbstractFactory】

来源:互联网 发布:unity3d 物体旋转 编辑:程序博客网 时间:2024/06/05 02:40

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

【案例】

承接上一篇工厂方法模式。由于市场需求变化,客户对猪产生兴趣,黑枣克隆公司不能不扩张生产线,以生产猪。

【分析OOA

工厂方法模式为狗族提供了统一的创建接口。当有多个产品族时,可以使用抽象工厂模式。

【设计OOD】

<UML>


<说明>

看看抽象工厂模式的各个角色(和工厂方法的如出一辙):

1、抽象工厂(Abstract Factory)角色:它声明一个创建抽象产品对象的接口。通常以接口或抽象类实现,所有的具体工厂类必须实现这个接口或继承这个类。

2、具体工厂(Concrete Factory)角色:实现创建产品对象的操作。客户端直接调用这个角色创建产品的实例。这个角色包含有选择合适的产品对象的逻辑。通常使用具体类实现。

3、抽象产品(Abstract Product)角色:声明一类产品的接口。它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。

4、具体产品(Concrete Product)角色:实现抽象产品角色所定义的接口,定义一个将被相应的具体工厂创建的产品对象。其内部包含了应用程序的业务逻辑。编程 OOP:

代码

[php] view plaincopy
  1. interface AnimalFactory  
  2. {  
  3.     public function createDog($color);  
  4.     public function createPig($color);  
  5. }  
  6.   
  7.   
  8. class BigAnimalFactory implements AnimalFactory  
  9. {  
  10.     public function createDog($color)  
  11.     {  
  12.         $dogtype = ucfirst(strtolower($color)) . 'BigDog';  
  13.         if (class_exists($dogtype)) {  
  14.             return new $dogtype();  
  15.         }  
  16.     }  
  17.   
  18.     public function createPig($color)  
  19.     {  
  20.         $pigtype = ucfirst(strtolower($color)) . 'BigPig';  
  21.         if (class_exists($pigtype)) {  
  22.             return new $pigtype();  
  23.         }  
  24.     }  
  25. }  
  26.   
  27. class SmallAnimalFactory implements AnimalFactory  
  28. {  
  29.     public function createDog($color)  
  30.     {  
  31.         $dogtype = ucfirst(strtolower($color)) . 'SmallDog';  
  32.         if (class_exists($dogtype)) {  
  33.             return new $dogtype();  
  34.         }  
  35.     }  
  36.   
  37.     public function createPig($color)  
  38.     {  
  39.         $pigtype = ucfirst(strtolower($color)) . 'SmallPig';  
  40.         if (class_exists($pigtype)) {  
  41.             return new $pigtype();  
  42.         }  
  43.     }  
  44. }  
  45.   
  46. interface Dog  
  47. {  
  48.     public function shout();  
  49. }  
  50.   
  51.   
  52. class BlackBigDog implements Dog  
  53. {  
  54.     public function shout()  
  55.     {  
  56.         echo "BlackBigDog Wao!Wao!Wao! \n";  
  57.     }  
  58. }  
  59.   
  60. class BlackSmallDog implements Dog  
  61. {  
  62.     public function shout()  
  63.     {  
  64.         echo "BlackSmallDog Wao!Wao!Wao! \n";  
  65.     }  
  66. }  
  67.   
  68. interface Pig  
  69. {  
  70.     public function shout();  
  71. }  
  72.   
  73. class BlackSmallPig implements Pig  
  74. {  
  75.     public function shout()  
  76.     {  
  77.         echo "BlackSmall Zhi!Zhi!Zhi! \n";  
  78.     }  
  79. }  
  80.   
  81. class BlackBigPig implements Pig  
  82. {  
  83.     public function shout()  
  84.     {  
  85.         echo "BlackGigPig  Zhi!Zhi!Zhi! \n";  
  86.     }  
  87. }  


【测试用例Test Case】

<代码>

[php] view plaincopy
  1. class testDriver  
  2. {  
  3.     public function run()  
  4.     {  
  5.         $bigfactory = new BigAnimalFactory();  
  6.         $dog1 = $bigfactory->createDog('black');  
  7.         $dog1->shout();  
  8.         $pig1 = $bigfactory->createPig('black');  
  9.         $pig1->shout();  
  10.         $smallfactory = new SmallAnimalFactory();  
  11.         $dog2 = $smallfactory->createDog('black');  
  12.         $dog2->shout();  
  13.         $pig2 = $smallfactory->createPig('black');  
  14.         $pig2->shout();  
  15.     }  
  16. }  

输出


【小结】

抽象工厂方法经常心工厂方法方式实现,抽象工厂的任务是定义一个负责创建一系列产品的接口。这个接口内每一个方法负责创建一个具体实例。

1、工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象

2、抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中

3、抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上,抽象工厂负责创建多个相关族产品,而工厂方法模式只用于单一族产品。


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

* 作者:叶文涛 

* 标题:

Php设计模式之工厂模式(三)【抽象工厂模式 AbstractFactory

* 参考:

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

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

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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 10个月宝宝呕吐怎么办 小孩又拉又吐的怎么办 小孩子不吃饭呕吐拉肚子怎么办 小孩发烧后又吐怎么办 11个月宝宝吐了怎么办 11个月宝宝拉肚子怎么办 2岁宝宝反复呕吐怎么办 1岁半幼儿拉肚子怎么办 宝宝打嗝呕吐胃难受怎么办 3岁宝宝发烧还吐怎么办 孩子喝水都吐怎么办啊 宝宝吃多了呕吐怎么办 3岁宝宝吐怎么办才好 儿童受凉肚子疼发热呕吐怎么办 两岁宝宝半夜呕吐怎么办 两岁宝宝吐了怎么办 2岁宝宝发烧吐怎么办 2岁多宝宝呕吐是怎么办 2周岁宝宝中暑了怎么办 2岁半宝宝着凉呕吐怎么办 3岁宝宝吐了几次怎么办 一岁宝宝恶心吐怎么办 9个月宝宝一直吐怎么办 晚上冻着了呕吐怎么办 2岁宝宝一直吐怎么办 两岁宝宝门牙龋齿怎么办 两岁宝宝得龋齿怎么办 两岁宝宝长龋齿怎么办 宝宝2岁不吃饭怎么办 两岁宝宝总是吐怎么办 3岁儿童受凉呕吐怎么办 两岁宝宝四天没拉大便怎么办 两岁宝宝发烧吐怎么办 四岁宝宝吐了怎么办啊 3岁宝宝突然吐了怎么办 宝宝撑着了吐拉怎么办 2岁宝宝体温37.5怎么办 宝宝2岁乳牙烂了怎么办 孕40周还没入盆怎么办 孕妇脸上长斑了怎么办 七个月宝宝大便干怎么办