PHP中“簡單原廠模式”執行個體講解

來源:互聯網
上載者:User

標籤:php   一個   throw   除法   val   耦合   簡單工廠   src   str   

原創文章,轉載請註明出處:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html簡單原廠模式:①抽象基類:類中定義抽象一些方法,用以在子類中實現②繼承自抽象基類的子類:實現基類中的抽象方法③工廠類:用以執行個體化對象看完文章再回頭來看下這張圖,效果會比較好
 1 採用封裝方式 2  3 <?php 4     class Calc{ 5         /** 6          * 計算結果 7          * 8          * @param int|float $num1 9          * @param int|float $num210          * @param string $operator11          * @return int|float12          */13         public function calculate($num1,$num2,$operator){14             try {15                 $result=0;16                 switch ($operator){17                     case ‘+‘:18                         $result= $num1+$num2;19                         break;20                     case ‘-‘:21                         $result= $num1-$num2;22                         break;23                     case ‘*‘:24                         $result= $num1*$num2;25                         break;26                     case ‘/‘:27                         if ($num2==0) {28                             throw new Exception("除數不能為0");29                         }30                         $result= $num1/$num2;31                         break;32                 }33             return $result;34             }catch (Exception $e){35                 echo "您輸入有誤:".$e->getMessage();36             }37         }38     }39     $test=new Calc();40 //    echo $test->calculate(2,3,‘+‘);//列印:541     echo $test->calculate(5,0,‘/‘);//列印:您輸入有誤:除數不能為042 ?>優點:以上代碼使用了物件導向的封裝特性,只要有了include這個類,其他頁面就可以隨便使用了缺點:無法靈活的擴充和維護比如:想要增加一個“求餘”運算,需要在switch語句塊中添加一個分支語句,代碼需要做如下改動 1 添加分支語句 2  3 <?php 4     class Calc{ 5         public function calculate($num1,$num2,$operator){ 6             try { 7                 $result=0; 8                 switch ($operator){ 9                     //......省略......10                     case ‘%‘:11                         $result= $num1%$num2;12                         break;13                     //......省略......14                 }15             }catch (Exception $e){16                 echo "您輸入有誤:".$e->getMessage();17             }18         }19     }20 ?>程式碼分析:用以上方法實現給計算機添加新的功能運算有以下幾個缺點①需要改動原有的代碼塊,可能會在為了“添加新功能”而改動原有代碼的時候,不小心將原有的代碼改錯了②如果要添加的功能很多,比如:‘乘方’,‘開方’,‘對數’,‘三角函數’,‘統計’,或者添加一些程式員專用的計算功能,比如:And, Or, Not, Xor,這樣就需要在switch語句中添加N個分支語句。想象下,一個計算功能的函數如果有二三十個case分支語句,代碼將超過一屏,不僅令代碼的可讀性大大降低,關鍵是,為了添加小功能,還得讓其餘不相關都參與解釋,這令程式的執行效率大大降低解決途徑:採用OOP的繼承和多態思想 1 簡單原廠模式的初步實現 2  <?php 3      /** 4       * 操作類 5       * 因為包含有抽象方法,所以類必須聲明為抽象類別 6       */ 7      abstract class Operation{ 8          //抽象方法不能包含函數體 9          abstract public function getValue($num1,$num2);//強烈要求子類必須實現該功能函數10      }11      /**12       * 加法類13       */14      class OperationAdd extends Operation {15          public function getValue($num1,$num2){16              return $num1+$num2;17          }18      }19      /**20       * 減法類21       */22      class OperationSub extends Operation {23          public function getValue($num1,$num2){24              return $num1-$num2;25          }26      }27      /**28       * 乘法類29       */30      class OperationMul extends Operation {31          public function getValue($num1,$num2){32              return $num1*$num2;33          }34      }35      /**36       * 除法類37       */38      class OperationDiv extends Operation {39          public function getValue($num1,$num2){40              try {41                  if ($num2==0){42                      throw new Exception("除數不能為0");43                  }else {44                      return $num1/$num2;45                  }46              }catch (Exception $e){47                  echo "錯誤資訊:".$e->getMessage();48              }49          }50      }51  ?>這裡採用了物件導向的繼承特性,首先聲明一個虛擬基類,在基類中指定子類務必實現的方法(getValue())分析:通過採用物件導向的繼承特性,我們可以很容易就能對原有程式進行擴充,比如:‘乘方’,‘開方’,‘對數’,‘三角函數’,‘統計’等等。<?php    /**     * 求餘類(remainder)     *     */    class OperationRem extends Operation {        public function getValue($num1,$num2){            return $num1%$num12;        }    }?>我們只需要另外寫一個類(該類繼承虛擬基類),在類中完成相應的功能(比如:求乘方的運算),而且大大的降低了耦合度,方便日後的維護及擴充現在還有一個問題未解決,就是如何讓程式根據使用者輸入的操作符執行個體化相應的對象呢?解決辦法:使用一個單獨的類來實現執行個體化的過程,這個類就是工廠代碼如下: 1 <?php 2     /** 3      * 工程類,主要用來建立對象 4      * 功能:根據輸入的運算子號,工廠就能執行個體化出合適的對象 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 ?>

 

PHP中“簡單原廠模式”執行個體講解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.