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

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

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

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

    通过采用面向对象的继承特性,可以很容易就能对原有程序进行扩展,比如:‘乘方’,‘开方’,‘对数’,‘三角函数’,‘统计’等,以还可以避免加载没有必要的代码。

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

    我们只需要另外写一个类(该类继承虚拟基类),在类中完成相应的功能(比如:求乘方的运算),而且大大的降低了耦合度,方便日后的维护及扩展
     
    现在还有一个问题未解决,就是如何让程序根据用户输入的操作符实例化相应的对象呢?
    解决办法:使用一个单独的类来实现实例化的过程,这个类就是工厂
     
    具体看看代码部分:
      1 /**
      2  * 工厂类,主要用来创建对象
      3  * 功能:根据输入的运算符号,工厂就能实例化出合适的对象
      4  */
      5 class Factory
      6 {
      7     public static function createObj($operate){
      8              switch ($operate){
      9                  case '+':
     10                      return new OperationAdd();
     11                     break;
     12                  case '-':
     13                      return new OperationSub();
     14                      break;
     15                  case '*':
     16                      return new OperationMul();
     17                      break;
     18                  case '/':
     19                      return new OperationDiv();
     20                      break;
     21                  case '%':
     22                      return new OperationRem();
     23                      break;
     24                  default:
     25                      break;
     26              }
     27     }
     28 }
     29 
     30 //调用工厂类静态方法
     31 $test = Factory::createObj('/');
     32 $result=$test->getValue(23,2);
     33 echo $result;
     34 
     35 
     36 /**
     37  *  下面可以拆分成多个类文件,此处未来方便查看不做拆分
     38  */
     39 
     40 /**
     41   *
     42   * 定义个抽象的类,让子类去继承实现它
     43   *
     44   */
     45   abstract class Operation{
     46       //抽象方法不能包含函数体
     47       abstract public function getValue($num1,$num2);//强烈要求子类必须实现该功能函数
     48   }
     49 
     50   /**
     51    * 加法类
     52    */
     53   class OperationAdd extends Operation {
     54       public function getValue($num1,$num2){
     55           return $num1+$num2;
     56       }
     57   }
     58   /**
     59    * 减法类
     60    */
     61   class OperationSub extends Operation {
     62       public function getValue($num1,$num2){
     63           return $num1-$num2;
     64       }
     65   }
     66   /**
     67    * 乘法类
     68    */
     69   class OperationMul extends Operation {
     70       public function getValue($num1,$num2){
     71           return $num1*$num2;
     72       }
     73   }
     74   /**
     75    * 除法类
     76    */
     77   class OperationDiv extends Operation {
     78       public function getValue($num1,$num2){
     79           try {
     80              if ($num2==0){
     81                   throw new Exception("除数不能为0");
     82               }else {
     83                   return $num1/$num2;
     84               }
     85           }catch (Exception $e){
     86               echo "错误信息:".$e->getMessage();
     87           }
     88       }
     89   }
     90 
     91 /**
     92   * 新增加
     93   * 求余类(remainder)
     94   *
     95   */
     96  class OperationRem extends Operation {
     97      public function getValue($num1,$num2){
     98          return $num1 % $num2;
     99      }
    100  }

    测试执行:输出结果 11.5

     
  • 相关阅读:
    codeforces 368(div 2)前三题
    codeforces 368(div 2)前三题
    hihocoder编程练习赛6+多重背包的各种姿势
    hihocoder编程练习赛6+多重背包的各种姿势
    hihocoder1077,线段树单点修改的一点小技巧
    hihocoder1077,线段树单点修改的一点小技巧
    [NOIP2013]货车运输,最大生成树+LCA
    [NOIP2013]货车运输,最大生成树+LCA
    hihocoder 1080 线段树:区间加法&赋值
    hihocoder 1080 线段树:区间加法&赋值
  • 原文地址:https://www.cnblogs.com/cutcop/p/13202702.html
Copyright © 2011-2022 走看看