运维开发网

php设计模式之简单工厂模式

运维开发网 https://www.qedev.com 2021-01-13 11:41 出处:51CTO 作者:mb5ff592736e0cf
简单工厂模式:抽象基类:类中定义抽象一些方法,用以在子类中实现继承自抽象基类的子类:实现基类中的抽象方法工厂类:用以实例化所有相对应的子类/**     * 定义个抽象的类,让子类去继承实现它     */     abstract class Operation{         //抽象方法不能包含函数体         abstract public function getValue($n

简单工厂模式:

  1. 抽象基类:类中定义抽象一些方法,用以在子类中实现

  2. 继承自抽象基类的子类:实现基类中的抽象方法

  3. 工厂类:用以实例化所有相对应的子类

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.分别写制造飞机,汽车的工厂类去继承实现这个接口

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号