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

    • ①抽象基类:类中定义抽象一些方法,用以在子类中实现
    • ②继承自抽象基类的子类:实现基类中的抽象方法
    • ③工厂类:用以实例化所有相对应的子类

     

     /**
         * 
         * 定义个抽象的类,让子类去继承实现它
         *
         */
         abstract class Operation{
             //抽象方法不能包含函数体
             abstract public function getValue($num1,$num2);//强烈要求子类必须实现该功能函数
         }
         
         
         
         /**
          * 加法类
          */
         class OperationAdd extends Operation {
             public function getValue($num1,$num2){
                 return $num1+$num2;
             }
         }
         /**
          * 减法类
          */
         class OperationSub extends Operation {
             public function getValue($num1,$num2){
                 return $num1-$num2;
             }
         }
         /**
          * 乘法类
          */
         class OperationMul extends Operation {
             public function getValue($num1,$num2){
                 return $num1*$num2;
             }
         }
         /**
          * 除法类
          */
         class OperationDiv extends Operation {
             public function getValue($num1,$num2){
                 try {
                     if ($num2==0){
                         throw new Exception("除数不能为0");
                     }else {
                         return $num1/$num2;
                     }
                 }catch (Exception $e){
                     echo "错误信息:".$e->getMessage();
                 }
             }
         }
    通过采用面向对象的继承特性,我们可以很容易就能对原有程序进行扩展,比如:‘乘方’,‘开方’,‘对数’,‘三角函数’,‘统计’等,以还可以避免加载没有必要的代码。

    如果我们现在需要增加一个求余的类,会非常的简单

    我们只需要另外写一个类(该类继承虚拟基类),在类中完成相应的功能(比如:求乘方的运算),而且大大的降低了耦合度,方便日后的维护及扩展
        /**
         * 求余类(remainder)
         *
         */
        class OperationRem extends Operation {
            public function getValue($num1,$num2){
                return $num1%$num12;
            }
        }
    现在还有一个问题未解决,就是如何让程序根据用户输入的操作符实例化相应的对象呢?
    解决办法:使用一个单独的类来实现实例化的过程,这个类就是工厂
        /**
         * 工程类,主要用来创建对象
         * 功能:根据输入的运算符号,工厂就能实例化出合适的对象
         *
         */
        class Factory{
            public static function createObj($operate){
                switch ($operate){
                    case '+':
                        return new OperationAdd();
                        break;
                    case '-':
                        return new OperationSub();
                        break;
                    case '*':
                        return new OperationSub();
                        break;
                    case '/':
                        return new OperationDiv();
                        break;
                }
            }
        }
        $test=Factory::createObj('/');
        $result=$test->getValue(23,0);
        echo $result;

    其他关于关于此模式的笔记:

    工厂模式:
    以交通工具为例子:要求请既可以定制交通工具,又可以定制交通工具生产的过程
    1>定制交通工具
        1.定义一个接口,里面包含交工工具的方法(启动 运行 停止)

        2.让飞机,汽车等类去实现他们
    2> 定制工厂(通上类似)
        1.定义一个接口,里面包含交工工具的制造方法(启动 运行 停止)

        2.分别写制造飞机,汽车的工厂类去继承实现这个接口
  • 相关阅读:
    第四章 变量的三大特征,垃圾回收机制,可变类型和不可变类型的简单表述
    第三章 有关变量的理解
    第二章 编程语言的分类及优缺点的分析
    IIS拓展访问的文件格式
    JS之HTTP请求
    HTTP请求
    HtmlAgilityPack解析html
    支付宝支付功能开发
    Web.config配置ActiveReports
    数据库连接字符串
  • 原文地址:https://www.cnblogs.com/timelesszhuang/p/4360894.html
Copyright © 2011-2022 走看看