大话设计模式之PHP篇 - 简单工厂模式

假设有一道编程题:输入两个数字和运算符,然后得到运算结果。非常简单的一道题目,通常的实现代码如下:

<?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数据库设计时也可用到工厂模式,根据不同的参数,选择不同的数据库类。

上一篇:Linux下vim 开发环境配置及配色(Ruby)


下一篇:<一>读<<大话设计模式>>之简单工厂模式