php设计模式之简单工厂模式

  简单工厂模式, 简单工厂模式不属于23种常用面向对象设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。其实质是由一个工厂类根据传入的参数动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例

  下面看一下简单工厂模式的实现:

 1 <?php
 2 //简单工厂方法
 3 interface Math
 4 {
 5     public function calculation( $x, $y );
 6 }
 7 
 8 //加法实现
 9 class Sum implements Math
10 {
11     public function calculation( $x, $y )
12     {
13         return $x + $y;
14     }
15 }
16 
17 //减法实现
18 class Sub implements Math
19 {
20     public function calculation( $x, $y )
21     {
22         return $x - $y;
23     }
24 }
25 
26 
27 //工厂方法
28 class Factory
29 {
30 
31     public static function doMath( $type )
32     {
33         switch( $type )
34         {
35             case "+":
36                 return new Sum();
37                 break;
38             case "-":
39                 return new Sub();
40                 break;
41         }
42     }
43 }
44 
45 $obj = Factory::doMath('-');
46 echo $obj->calculation( 1, 2 );

  一个工厂类Factory,根据访问传入的符号不同,去动态的实例化不同的类。这样我们就不需要自己去实例化类,无论用户要进行何种计算,只需要实例化时:Factory::doMath('-'),传入自己想要的计算符号即可。而不需要自己去实例化相应的计算类。并且

调用统一的计算方法calculation(1, 2),传入参数即可获得结果。这样看来,简单工厂方法确实很是方便。但是,简单工厂方法违背了设计模式的一个原则:开放与封闭原则

  什么是开放与封闭原则呢?简单的讲就是:程序对扩展来说是开放的,对修改来说是封闭的。本案例,如果我想加入一个乘法计算,那么很简单我再添加一个乘法的类,但是,我必须去修改Factory类的doMath方法,将我新加入的乘法计算添加进去,这样就破坏了原来的类,也就违背了封闭原则。这时,工厂方法就解决了简单工厂违背开放与封闭原则的问题,php设计模式之工厂方法

posted @ 2016-11-23 15:29  NickBai  阅读(318)  评论(0编辑  收藏  举报