zoukankan      html  css  js  c++  java
  • 设计模式-简单工厂

    结构

    1个工厂;
    1个 interface 或者 abstract 产品父类;
    多个实现 interface 或者继承 abstract 的具体产品类;

    先整一个计算器  正常版的  不考虑扩展的

    <?php 
    
    namespace SimpleFactory;
    /**
     *    计算器 
     *
     * 
     */
    Class Bad {
    
        public function getResult($numA, $operate, $numB)
        {
            switch ($operate) {
                case '+':
                    $result = $numA + $numB;
                    break;
                case '-':
                    $result = $numA - $numB;
                    break;
                case '*':
                    $result = $numA * $numB;
                    break;
                case '/':
                    if($numB != 0) {
                        $result = $numA / $numB;
                    } else {
                        throw new Exception('除数不能为0', 1);
                    }
                    
                    break;
    
                default:
                    throw new Exception('暂不支持当前运算', 1);
            }
            return $result;
        }
    }
    
    
    $program = new Bad();
    $result = $program->getResult(1, '+', 2);
    var_dump($result);
     ?>

    这里的逻辑判断流程和  实现代码各种混和   不利于扩展

    来个简单工厂

    先整个操作抽象类

    <?php 
    
    namespace SimpleFactory;
    
    /**
     *
     * 操作抽象类
     */
    
    abstract class Operate 
    {
        /**
         * 运算符号左边的值
         */
        
        protected $numA = 0;
    
        /*运算符号右边的值*/
    
        protected $numB = 0;
    
        /**
         * 计算结果
         */
        abstract public function getResult();
        
        // 给 numA 赋值
    
        public function setNumA($number)
        {
            $this->numA = $number;
        }
    
        // 给 numB赋值
        public function setNumB($number)
        {
                $this->numB = $number;
        }
    }
    
    
     ?>

    把各个运算独立分装

    <?php 
    
    namespace SimpleFactory;
    
    
    /**
     * 加法类
     */
    class Add extends Operate
    {
        
        public function getResult()
        {
            return $this->numA + $this->numB;
        }
    }
    
     ?>
    <?php 
    
    namespace SimpleFactory;
    
    /**
     * 减法类
     */
    class Sub extends Operate
    {
        
        public function getResult()
        {
            return $this->numA - $this->numB;
        }
    }
    
    
     ?>
    <?php 
    
    
    namespace SimpleFactory;
    
    /**
     * 乘法类
     */
    class Mul extends Operate
    {
        
        function getResult()
        {
            return $this->numA * $this->numB;
        }
    }
    
    
     ?>
    <?php 
    
    namespace SimpleFactory;
    
    /**
     * 除法类
     */
    class Div extends Operate
    {
        
        function get_Result()
        {
            if($this->numB == 0) {
                throw new Exception('除数不能为0', 1);
            }
            return $this->numA / $this->numB;
        }
    }
    
    
    
     ?>

    来个工厂类实现一下

    <?php 
    
    namespace SimpleFactory;
    require './operate.php';
    require './add.php';
    
    /**
     * 工厂类
     */
    class Factory  
    {
        // 创建一种运算
        public function create($operate)
        {
            switch ($operate) {
                case '+':
                    $result = new Add();
                    break;
                case '-':
                    $result = new sub();
                    break;
                case '*':
                    $result = new mul();
                    break;
                case '/':
                    $result = new div();
                    break;
                
                default:
                    throw new Exception("暂不支持", 1);
                    
                    break;
            }
            return $result;
        }
    }
    
    $factory = new Factory();
    $operate = $factory->create('+');
    $operate->setNumA(23);
    $operate->setNumB(3777);
    $result = $operate->getResult();
    echo $result;
    
     ?>
  • 相关阅读:
    python操作json来存储简单的数据,pickle来操作复杂的数据
    python元组,列表,字典练习
    python文件实现增删改查操作
    socket模拟服务器,客户端下载东西(ftp)
    optiontransferselect标签
    doubleselect标签联动选择框
    datetimepicker标签日期选择器
    combobox标签复合框
    checkboxlist标签多选框组
    使用动态数据的autocomplete标签
  • 原文地址:https://www.cnblogs.com/lx0715/p/10110429.html
Copyright © 2011-2022 走看看