国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP中簡單工廠模式實例講解

2024-05-04 21:48:42
字體:
供稿:網(wǎng)友

PHP中簡單工廠模式實例講解,簡單的講述了一下大家可參考一下.

簡單工廠模式:

①抽象基類:類中定義抽象一些方法,用以在子類中實現(xiàn)

②繼承自抽象基類的子類:實現(xiàn)基類中的抽象方法

③工廠類:用以實例化對象

采用封裝方式,代碼如下:

  1. <?php 
  2.     class Calc{ 
  3.         /** 
  4.          * 計算結(jié)果 
  5.          * 
  6.          * @param int|float $num1 
  7.          * @param int|float $num2 
  8.          * @param string $operator 
  9.          * @return int|float 
  10.          */ 
  11.         public function calculate($num1,$num2,$operator){ 
  12.             try { 
  13.                 $result=0; 
  14.                 switch ($operator){ 
  15.                     case '+'
  16.                         $result$num1+$num2
  17.                         break
  18.                     case '-'
  19.                         $result$num1-$num2
  20.                         break
  21.                     case '*'
  22.                         $result$num1*$num2
  23.                         break
  24.                     case '/'
  25.                         if ($num2==0) { 
  26.                             throw new Exception("除數(shù)不能為0"); 
  27.                         } 
  28.                         $result$num1/$num2
  29.                         break
  30.                     return $result
  31.                 } 
  32.             }catch (Exception $e){ 
  33.                 echo "您輸入有誤:".$e->getMessage(); 
  34.             }//開源代碼Vevb.com 
  35.         } 
  36.     } 
  37.     $test=new Calc(); 
  38. //    echo $test->calculate(2,3,'+');//打印:5 
  39.     echo $test->calculate(5,0,'/');//打印:您輸入有誤:除數(shù)不能為0 
  40. ?> 

優(yōu)點:以上代碼使用了面向?qū)ο蟮姆庋b特性,只要有了include這個類,其他頁面就可以隨便使用了.

缺點:無法靈活的擴展和維護

比如:想要增加一個“求余”運算,需要在switch語句塊中添加一個分支語句,代碼需要做如下改動,添加分支語句,代碼如下:

  1. <?php 
  2.     class Calc{ 
  3.         public function calculate($num1,$num2,$operator){ 
  4.             try { 
  5.                 $result=0; 
  6.                 switch ($operator){ 
  7.                     //......省略...... 
  8.                     case '%'
  9.                         $result$num1%$num2
  10.                         break
  11.                     //......省略...... 
  12.                 } 
  13.             }catch (Exception $e){ 
  14.                 echo "您輸入有誤:".$e->getMessage(); 
  15.             } 
  16.         } 
  17.     } 
  18. ?> 

代碼分析:用以上方法實現(xiàn)給計算器添加新的功能運算有以下幾個缺點.

①需要改動原有的代碼塊,可能會在為了“添加新功能”而改動原有代碼的時候,不小心將原有的代碼改錯了.

②如果要添加的功能很多,比如:‘乘方’,‘開方’,‘對數(shù)’,‘三角函數(shù)’,‘統(tǒng)計’,或者添加一些程序員專用的計算功能,比如:And,Or,Not,Xor,這樣就需要在switch語句中添加N個分支語句,想象下,一個計算功能的函數(shù)如果有二三十個case分支語句,代碼將超過一屏,不僅令代碼的可讀性大大降低,關(guān)鍵是,為了添加小功能,還得讓其余不相關(guān)都參與解釋,這令程序的執(zhí)行效率大大降低.

解決途徑:采用OOP的繼承和多態(tài)思想.

簡單工廠模式的初步實現(xiàn),代碼如下:

  1. <?php 
  2.      /** 
  3.       * 操作類 
  4.       * 因為包含有抽象方法,所以類必須聲明為抽象類 
  5.       */ 
  6.      abstract class Operation{ 
  7.          //抽象方法不能包含函數(shù)體 
  8.          abstract public function getValue($num1,$num2);//強烈要求子類必須實現(xiàn)該功能函數(shù) 
  9.      } 
  10.      /** 
  11.       * 加法類 
  12.       */ 
  13.      class OperationAdd extends Operation { 
  14.          public function getValue($num1,$num2){ 
  15.              return $num1+$num2
  16.          } 
  17.      } 
  18.      /** 
  19.       * 減法類 
  20.       */ 
  21.      class OperationSub extends Operation { 
  22.          public function getValue($num1,$num2){ 
  23.              return $num1-$num2
  24.          } 
  25.      } 
  26.      /** 
  27.       * 乘法類 
  28.       */ 
  29.      class OperationMul extends Operation { 
  30.          public function getValue($num1,$num2){ 
  31.              return $num1*$num2
  32.          } 
  33.      } 
  34.      /** 
  35.       * 除法類 
  36.       */ 
  37.      class OperationDiv extends Operation { 
  38.          public function getValue($num1,$num2){ 
  39.              try { 
  40.                  if ($num2==0){ 
  41.                      throw new Exception("除數(shù)不能為0"); 
  42.                  }else { 
  43.                      return $num1/$num2
  44.                  } 
  45.              }catch (Exception $e){ 
  46.                  echo "錯誤信息:".$e->getMessage(); 
  47.              } 
  48.          } 
  49.      } 
  50.  ?> 

采用了面向?qū)ο蟮睦^承特性,首先聲明一個虛擬基類,在基類中指定子類務(wù)必實現(xiàn)的方法(getValue()).

分析:通過采用面向?qū)ο蟮睦^承特性,我們可以很容易就能對原有程序進行擴展,比如:‘乘方’,‘開方’,‘對數(shù)’,‘三角函數(shù)’,‘統(tǒng)計’等等.

求余類,代碼如下:

  1. <?php 
  2.     /** 
  3.      * 求余類(remainder) 
  4.      * 
  5.      */ 
  6.     class OperationRem extends Operation { 
  7.         public function getValue($num1,$num2){ 
  8.             return $num1%$num12
  9.         } 
  10.     } 
  11. ?> 

我們只需要另外寫一個類(該類繼承虛擬基類),在類中完成相應(yīng)的功能(比如:求乘方的運算),而且大大的降低了耦合度,方便日后的維護及擴展.

現(xiàn)在還有一個問題未解決,就是如何讓程序根據(jù)用戶輸入的操作符實例化相應(yīng)的對象呢?

解決辦法:使用一個單獨的類來實現(xiàn)實例化的過程,這個類就是工廠,工廠類代碼如下:

  1. <?php 
  2.     /** 
  3.      * 工程類,主要用來創(chuàng)建對象 
  4.      * 功能:根據(jù)輸入的運算符號,工廠就能實例化出合適的對象 
  5.      * 
  6.      */ 
  7.     class Factory{ 
  8.         public static function createObj($operate){ 
  9.             switch ($operate){ 
  10.                 case '+'
  11.                     return new OperationAdd(); 
  12.                     break
  13.                 case '-'
  14.                     return new OperationSub(); 
  15.                     break
  16.                 case '*'
  17.                     return new OperationSub(); 
  18.                     break
  19.                 case '/'
  20.                     return new OperationDiv(); 
  21.                     break
  22.             } 
  23.         } 
  24.     } 
  25.     $test=Factory::createObj('/'); 
  26.     $result=$test->getValue(23,0); 
  27.     echo $result
  28. ?>

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 辽阳县| 新干县| 嘉义县| 定州市| 寿光市| 茂名市| 民权县| 巴林右旗| 弥渡县| 龙游县| 饶平县| 鄂托克前旗| 教育| 和平区| 中超| 达日县| 阿鲁科尔沁旗| 蓬莱市| 沙田区| 三门峡市| 保德县| 小金县| 四川省| 大厂| 尤溪县| 冕宁县| 深圳市| 友谊县| 沅江市| 卢湾区| 新余市| 溆浦县| 修文县| 神木县| 水城县| 青海省| 迁安市| 利津县| 洱源县| 富平县| 富宁县|