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设计模式之工厂方法
声明:本文内容仅是本人学习的记录,不保证在项目中可用,若引用此代码导致了严重后果,本人不承担任何法律责任。