使用简单工厂实现计算器

   
   
   
   
  1. namespace SimpleFactory\OperationClass; 
  2. /** 
  3.  * 运算抽象类 
  4.  * @author struggle 
  5.  * @verison 2012-5-28 
  6.  */ 
  7. abstract  class Operation{ 
  8.     /** 
  9.      * 计算结果 
  10.      * @param int/float $param1 参数1 
  11.      * @param int/float $param2 参数2 
  12.      */ 
  13.     public abstract  function getResult($param1,$param2); 
  14. /** 
  15.  * 加法类  
  16.  * @author struggle 
  17.  * @verison 2012-5-24 
  18.  */ 
  19. class OperationAdd extends Operation { 
  20.      
  21.     public function getResult($param1,$param2){ 
  22.         return $param1 + $param2
  23.     } 
  24. /** 
  25.  * 减法类 
  26.  * @author struggle 
  27.  * @verison 2012-5-24 
  28.  */ 
  29. class OperationSub extends Operation { 
  30.      
  31.     public function getResult($param1,$param2){ 
  32.         return $param1 - $param2
  33.     } 
  34. /** 
  35.  * 乘法类 
  36.  * @author struggle 
  37.  * @verison 2012-5-24 
  38.  */ 
  39. class OperationMul extends Operation { 
  40.     /** 
  41.      * 返回乘法结果 
  42.      */ 
  43.     public function getResult($param1,$param2){ 
  44.         return $param1 * $param2
  45.     } 
  46. /** 
  47.  * 除法类 
  48.  * @author struggle 
  49.  * @verison 2012-5-24 
  50.  */ 
  51. class OperationDiv extends Operation { 
  52.     /** 
  53.      * 返回乘法结果 
  54.      */ 
  55.     public function getResult($param1,$param2){ 
  56.         if($param2 == 0){ 
  57.             throw new \Exception('被除数不能为 0'); 
  58.         } 
  59.         return $param1 /$param2
  60.     } 

工厂类:

   
   
   
   
  1. namespace  SimpleFactory; 
  2. use SimpleFactory\OperationClass; 
  3. /** 
  4.  * 工厂类 
  5.  * @author struggle 
  6.  * @verison 2012-5-24 
  7.  */ 
  8. class OperationFactory { 
  9.     /** 
  10.      * 创建操作类 
  11.      * @param string $string 
  12.      */ 
  13.     public static  function createOpertaion($string){ 
  14.          $operation = ''
  15.         switch ($string) { 
  16.             case '+'
  17.                $operation = new OperationClass\OperationAdd(); 
  18.                break
  19.             case '-'
  20.                 $operation = new OperationClass\OperationSub(); 
  21.                 break
  22.             case '*'
  23.                 $operation = new OperationClass\OperationMul(); 
  24.                 break
  25.             case '/'
  26.                 $operation = new OperationClass\OperationDiv(); 
  27.                 break
  28.             default
  29.                 throw  new \Exception("没有此运算符"); 
  30.             break
  31.         } 
  32.         return $operation
  33.     } 

客户端调用程序:

   
   
   
   
  1. /** 
  2.  * 工厂设计模式 
  3.  */ 
  4. use SimpleFactory\OperationFactory; 
  5. define('ROOT_PATH',dirname(dirname(__FILE__)).'/'); 
  6. /** 
  7.  * 自动加载类文件 
  8.  * @param $class 
  9.  */ 
  10. function __autoload($class){ 
  11.     if(strpos($class,'OperationClass')){ 
  12.         $class_path = substr($class,0,strrpos($class,'\\')); 
  13.     }else
  14.         $class_path = str_replace('\\','/',$class); 
  15.     } 
  16.     include_once ROOT_PATH.$class_path.'.class.php'
  17. //调用工厂方法生成运算对象 
  18. $oper = OperationFactory::createOpertaion('/'); 
  19. $result = $oper->getResult(1,10); 
  20. var_dump($result); 

UML类图:

使用VISO做的类图有些差

简单工厂模式_第1张图片