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

來源:互聯網
上載者:User
簡單原廠模式:
①抽象基類:類中定義抽象一些方法,用以在子類中實現
②繼承自抽象基類的子類:實現基類中的抽象方法
③工廠類:用以執行個體化對象

看完文章再回頭來看下這張圖,效果會比較好

採用封裝方式<?php    class Calc{        /**         * 計算結果         *         * @param int|float $num1         * @param int|float $num2         * @param string $operator         * @return int|float         */        public function calculate($num1,$num2,$operator){            try {                $result=0;                switch ($operator){                    case '+':                        $result= $num1+$num2;                        break;                    case '-':                        $result= $num1-$num2;                        break;                    case '*':                        $result= $num1*$num2;                        break;                    case '/':                        if ($num2==0) {                            throw new Exception("除數不能為0");                        }                        $result= $num1/$num2;                        break;                }            return $result;            }catch (Exception $e){                echo "您輸入有誤:".$e->getMessage();            }        }    }    $test=new Calc();//    echo $test->calculate(2,3,'+');//列印:5    echo $test->calculate(5,0,'/');//列印:您輸入有誤:除數不能為0?>

優點:以上代碼使用了物件導向的封裝特性,只要有了include這個類,其他頁面就可以隨便使用了

缺點:無法靈活的擴充和維護
比如:想要增加一個“求餘”運算,需要在switch語句塊中添加一個分支語句,代碼需要做如下改動

添加分支語句<?php    class Calc{        public function calculate($num1,$num2,$operator){            try {                $result=0;                switch ($operator){                    //......省略......                    case '%':                        $result= $num1%$num2;                        break;                    //......省略......                }            }catch (Exception $e){                echo "您輸入有誤:".$e->getMessage();            }        }    }?>

程式碼分析:用以上方法實現給計算機添加新的功能運算有以下幾個缺點

①需要改動原有的代碼塊,可能會在為了“添加新功能”而改動原有代碼的時候,不小心將原有的代碼改錯了
②如果要添加的功能很多,比如:‘乘方’,‘開方’,‘對數’,‘三角函數’,‘統計’,或者添加一些程式員專用的計算功能,比如:And, Or, Not, Xor,這樣就需要在switch語句中添加N個分支語句。想象下,一個計算功能的函數如果有二三十個case分支語句,代碼將超過一屏,不僅令代碼的可讀性大大降低,關鍵是,為了添加小功能,還得讓其餘不相關都參與解釋,這令程式的執行效率大大降低
解決途徑:採用OOP的繼承和多態思想

簡單原廠模式的初步實現 <?php     /**      * 操作類      * 因為包含有抽象方法,所以類必須聲明為抽象類別      */     abstract class Operation{         //抽象方法不能包含函數體         abstract public function getValue($num1,$num2);//強烈要求子類必須實現該功能函數     }     /**      * 加法類      */     class OperationAdd extends Operation {         public function getValue($num1,$num2){             return $num1+$num2;         }     }     /**      * 減法類      */     class OperationSub extends Operation {         public function getValue($num1,$num2){             return $num1-$num2;         }     }     /**      * 乘法類      */     class OperationMul extends Operation {         public function getValue($num1,$num2){             return $num1*$num2;         }     }     /**      * 除法類      */     class OperationDiv extends Operation {         public function getValue($num1,$num2){             try {                 if ($num2==0){                     throw new Exception("除數不能為0");                 }else {                     return $num1/$num2;                 }             }catch (Exception $e){                 echo "錯誤資訊:".$e->getMessage();             }         }     } ?>

這裡採用了物件導向的繼承特性,首先聲明一個虛擬基類,在基類中指定子類務必實現的方法(getValue())

分析:通過採用物件導向的繼承特性,我們可以很容易就能對原有程式進行擴充,比如:‘乘方’,‘開方’,‘對數’,‘三角函數’,‘統計’等等。

<?php    /**     * 求餘類(remainder)     *     */    class OperationRem extends Operation {        public function getValue($num1,$num2){            return $num1%$num12;        }    }?>

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

現在還有一個問題未解決,就是如何讓程式根據使用者輸入的操作符執行個體化相應的對象呢?
解決辦法:使用一個單獨的類來實現執行個體化的過程,這個類就是工廠
代碼如下:

<?php    /**     * 工程類,主要用來建立對象     * 功能:根據輸入的運算子號,工廠就能執行個體化出合適的對象     *     */    class Factory{        public static function createObj($operate){            switch ($operate){                case '+':                    return new OperationAdd();                    break;                case '-':                    return new OperationSub();                    break;                case '*':                    return new OperationSub();                    break;                case '/':                    return new OperationDiv();                    break;            }        }    }    $test=Factory::createObj('/');    $result=$test->getValue(23,0);    echo $result;?>



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.