简单工厂模式

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

复制代码
<?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

原文地址:https://www.cnblogs.com/qiminghaonan/p/10954721.html