假设有一道编程题:输入两个数字和运算符,然后得到运算结果。非常简单的一道题目,通常的实现代码如下:
<?php Function Operation($val1, $val2, $operate) { Switch($operate) { Case ‘+’ : $result = $val1+$val2; Break; Case ‘-’ : $result = $val1-$val2; Break; Case ‘*’ : $result = $val1*$val2; Break; Case ‘/’ : $result = $val1/$val2; Break; } Return $result; }
上述代码,乍一看还是不错的,采用了分支结构,简洁明了,对于一般的小型应用足够了。当我们要增加一个运算符时,需要再次修改上述主体代码。有没有办法再不修改主体代码的情况下,而实现功能改变了?
通过面向对象的思想,通过封装、继承、多态将程序的耦合性降到最低。
简单工厂模式
<?php /*定义接口类*/ Interface Operate { function get_Value($val1, $val2); //此方法必须实现 } /*加法类*/ Class Operate_Add implements Operate { public function get_Value($val1, $val2) { return $val1 + $val2; } } /*减法类*/ Class Operate_Sub implements Operate { public function get_Value($val1, $val2) { return $val1 - $val2; } } /*乘法类*/ Class Operate_Multiply implements Operate { public function get_Value($val1, $val2) { return $val1 * $val2; } } /*除法类*/ Class Operate_Divide implements Operate { public function get_Value($val1, $val2) { return $val1 / $val2; } } 使用工厂,定义工厂类 Class Factory { public static function Create_Operation($operate) { Switch($operate) { Case '+': return new Operate_Add; break; Case '-': return new Operate_Sub; break; Case '*': return new Operate_Multiply; break; Case '/': return new Operate_Divide; break; } } } $mys = Factory:: Create_Operation ('+'); $result = $mys ->get_Value(1, 2);
当我们要增加一个求余的算法时,只需要增加一个求余类:
/*求余类*/ Class Operate_Remain implements Operate { public function get_Value($val1, $val2) { return $val1 % $val2; } }
修改工厂类即可,而无法修改具体的实现代码:
Class Factory { Public function Create_Operation($operate) { Switch($operate) { Case ‘+’: return new Operate_Add; break; } Switch($operate) { Case ‘-’: return new Operate_Sub; break; } Switch($operate) { Case ‘*’: return new Operate_ Multiply; break; } Switch($operate) { Case ‘/’: return new Operate_ Divide; break; } Switch($operate) { Case ‘%’: return new Operate_ Remain; break; } } }
看了这么多代码,其实说白了就一个道理:根据接收的条件,选择合适的类。
这种方法与PHP web开发中MVC模式十分类似:根据URI参数,选择不同的控制器类和实现方法。
其实在PHP数据库设计时也可用到工厂模式,根据不同的参数,选择不同的数据库类。
来自:https://www.cnblogs.com/fancing/p/6394160.html