博客列表 >简单工厂模式

简单工厂模式

齐天大圣的博客
齐天大圣的博客原创
2019年06月16日 15:10:311684浏览

需求:完成一个计算器,计算2个数的加减乘除等操作

class Cal
{
    public function countVal ($num1, $num2, $type)
    {
        switch ($type) {
            case '+' :
                // 验证……
                $count = $num1 + $num2;
                break;
            case '-' :
                // 验证……
                $count = $num1 - $num2;
                break;
             // …… 若有其他计算累计,继续加case判断。
        }
    }
}

 以上代码会有些问题,若验证的代码很长,或计算类型很多,那countVal方法就会变得非常长,将难以阅读及维护。

改进如下:

interface IMath
{
    function count($num1, $num2);
}
class Add implements IMath
{
    public function count($num1, $num2)
    {
        return $num1 + $num2;
    }
}
class Sub implements IMath
{
    public function count($num1, $num2)
    {
        return $num1 - $num2;
    }
}
class Cal
{
    // 这里就叫简单工厂模式
    public static function getMath ($type)
    {
        switch ($type) {
            case '+' :
                return new Add();
                break;
            case '-':
                return new Sub();
                break;
             // ……
        }
    }
}
$math = Cal::getMath('+');
echo $math->count(10,

 

以上代码比之前的改进在与,在getMath方法里,只负责new出相应的计算类,不需要管具体的验证等操作,而且写好的计算类今后是不需要改动的

 

不过,这种简单工厂模式只适合计算类型很少的情形。 如果计算类型很多,比如取模、平方根、正弦、余弦等。 那他就不符合了。

首先他违背了开闭原则,新增了一个计算类型,Cal类就需要修改。其次,getMath方法将很长,难以阅读。

如何解决,使用工厂模式。


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议