首頁 > 後端開發 > php教程 > PHP中「簡單工廠模式」實例講解

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

高洛峰
發布: 2023-03-03 15:06:01
原創
1065 人瀏覽過

簡單工廠模式:
①抽象基底類別:類別中定義抽象化一些方法,用以在子類別中實作
②繼承自抽象基底類別的子類別:實作基底類別中的抽象方法
③工廠類別:用以實例化物件

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

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

采用封装方式

<?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 &#39;+&#39;:
                        $result= $num1+$num2;
                        break;
                    case &#39;-&#39;:
                        $result= $num1-$num2;
                        break;
                    case &#39;*&#39;:
                        $result= $num1*$num2;
                        break;
                    case &#39;/&#39;:
                        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,&#39;+&#39;);//打印:5
    echo $test->calculate(5,0,&#39;/&#39;);//打印:您输入有误:除数不能为0
?>
登入後複製

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

缺點:無法靈活的擴充與維護
例如:想要增加一個「求餘」運算,需要在switch語句區塊中加入一個分支語句,程式碼需要做如下改動

添加分支语句

<?php
    class Calc{
        public function calculate($num1,$num2,$operator){
            try {
                $result=0;
                switch ($operator){
                    //......省略......
                    case &#39;%&#39;:
                        $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 &#39;+&#39;:
                    return new OperationAdd();
                    break;
                case &#39;-&#39;:
                    return new OperationSub();
                    break;
                case &#39;*&#39;:
                    return new OperationSub();
                    break;
                case &#39;/&#39;:
                    return new OperationDiv();
                    break;
            }
        }
    }
    $test=Factory::createObj(&#39;/&#39;);
    $result=$test->getValue(23,0);
    echo $result;
?>
登入後複製



更多PHP中「簡單工廠模式」實例講解相關文章請關注PHP網!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板