本文是这两天对工厂模式学习的一些心情随笔和心得体会。

  在我们会对一些常用的方法进行封装时,更进一步的使用跟添加修改,不用工厂模式的话,会出现添加新操作可能需要去改源码,可能你前阵子封装好的东西就不小心被你改动了,引发一些不必要的问题。而且在使用上可能会出现经常复制黏贴的窘境,如何用简短代码就可以实现对应的对象,这就需要用到常见设计模式中的工厂模式。

  

//正常的封装,用来对比
class Count{
/**
* 根据相应的操作进行计算
* @name countNum
* @param int|float num1
* @param int|float num2
* @param string $operate
* @return int|float
*
*/

public function countNum( $num1,$num2,$operate){
try{
$result = 0;
switch($operate){
case '+':
$result = $num1 + $num2;
break;
case '-':
$result = $num1 - $num2;
break;
case '*':
$result = $num1 * $num2;
break;
case '/':
if($num2 == 0){
throw new Exception('除数不能为0');
}else{
$result = $num1 / $num2;
}
break;
}
return $result;

}catch(Exception $e){
echo "您的输入有误:" . $e->getMessage();
}
}
}

$p = new Count();
echo $p->countNum(3, 1, '+');
echo "<br/>";
echo $p->countNum(5, 0, '/');
/**
*
*这样看似使用起来没什么问题,但是当我们还想添加一些计算操作的话就要去增加switch里面的case,这样直接去改变countNum方法里面的代码,其实是很不好的,
*因为可能不小心改动到其他地方,到时程序不能使用。所有这时候就要用高级点的方法。
*
**/

interface Operate{
public function getValue($num1,$num2);
}
//加法类
class Add implements Operate{
public function getValue($num1,$num2){
return $num1 + $num2;
}
}
//减法类
class Subtraction implements Operate{
public function getValue($num1, $num2){
return $result = $num1 - $num2;
}
}
//其他操作省略...这样大大降低了耦合度...我们可以随意的添加一些操作

//工厂类,主要用来创建对象。功能:根据输入的运算符号,工厂就能实例化出合适的对象
class Factory{
public static function createObj($operate){
switch($operate){
case '+':
return new Add();
break;
case '-':
return new Subtraction();
break;
}
}
}

$p = Factory::createObj('-');
$reseult = $p->getValue(5, 5);
echo $reseult;

    

PS 内功还修炼不够,写得比较浅显。

posted on 2016-01-02 21:52  BGGANF  阅读(155)  评论(0)    收藏  举报