简单工厂模式

2019年06月16日 15:10:31阅读数:1509博客 / 齐天大圣的博客 / php设计模式

需求:完成一个计算器,计算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举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 博主信息
    齐天大圣的博客
    博文
    6
    粉丝
    3
    评论
    1
    访问量
    7980
    积分:0
    P豆:230