zoukankan      html  css  js  c++  java
  • PHP设计模式之工厂模式

    工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是 你要生成的对象对应的类名称。
    ①抽象基类:类中定义抽象一些方法,用以在子类中实现
    ②继承自抽象基类的子类:实现基类中的抽象方法
    ③工厂类:用以实例化对象

    eg:

    简单工厂模式的初步实现
     <?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();
                 }
             }
         }
     ?>

    这里采用了面向对象的继承特性,首先声明一个虚拟基类,在基类中指定子类务必实现的方法(getValue())

    分析:通过采用面向对象的继承特性,我们可以很容易就能对原有程序进行扩展,比如:‘乘方’,‘开方’,‘对数’,‘三角函数’,‘统计’等等。

    eg:

     

    求余类
     
    <?php
        /**
         * 求余类(remainder)
         *
         */
        class OperationRem extends Operation {
            public function getValue($num1,$num2){
                return $num1%$num12;
            }
        }
    ?>

     

    我们只需要另外写一个类(该类继承虚拟基类),在类中完成相应的功能(比如:求乘方的运算),而且大大的降低了耦合度,方便日后的维护及扩展

    现在还有一个问题未解决,就是如何让程序根据用户输入的操作符实例化相应的对象呢?
    解决办法:使用一个单独的类来实现实例化的过程,这个类就是工厂
    代码如下:

     

    工厂类
     
    <?php
        /**
         * 工程类,主要用来创建对象
         * 功能:根据输入的运算符号,工厂就能实例化出合适的对象
         *
         */
        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;
    ?
    摘自:http://bbs.phpchina.com/thread-242243-1-1.html

     

     

     

  • 相关阅读:
    史上最全的浏览器 CSS & JS Hack 手册
    JavaScript1.6数组新特性和JQuery的几个工具方法
    用jquery循环map
    javascript强大的日期函数
    用 javascript 判断 IE 版本号
    常见排序算法基于JS的实现
    JavaScript中callee,caller,argument的理解
    apply()方法和call()方法
    虽然我们可能不想对元素应用3D变换,可我们一样可以开启3D引擎
    在移动端上加上代码,让字体变得平滑
  • 原文地址:https://www.cnblogs.com/ShowJoy/p/3749253.html
Copyright © 2011-2022 走看看