• 简单工厂模式


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

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

  • 相关阅读:
    C++命名规则
    protobuf_1
    以太网帧格式
    LinQ
    asp.mvc 基本知识
    Lucene.Net 优化索引生成,即搜索显示优化
    HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用
    DataSet
    伪Excel导出新版代码
    WebUI 常用
  • 原文地址:https://www.cnblogs.com/qiminghaonan/p/10954721.html
Copyright © 2020-2023  润新知