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

 
原文地址:https://www.cnblogs.com/cutcop/p/13202702.html