Heim > Backend-Entwicklung > PHP-Tutorial > Beispielerklärung zum „Simple Factory Pattern' in PHP

Beispielerklärung zum „Simple Factory Pattern' in PHP

高洛峰
Freigeben: 2023-03-03 15:06:01
Original
1082 Leute haben es durchsucht

Einfaches Factory-Muster:
①Abstrakte Basisklasse: Definieren Sie einige abstrakte Methoden in der Klasse, die in Unterklassen implementiert werden sollen
②Unterklassen, die von abstrakten Basisklassen erben: Implementieren Sie abstrakte Methoden in der Basisklasse
③Factory-Klasse: verwendet um Objekte zu instanziieren

Nachdem Sie den Artikel gelesen haben, schauen Sie sich dieses Bild noch einmal an, der Effekt wird besser sein

Beispielerklärung zum „Simple Factory Pattern in 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
?>
Nach dem Login kopieren

Vorteile: Der obige Code verwendet Objekte -orientierte Kapselungsfunktionen. Solange Sie über die Include-Klasse verfügen, können andere Seiten diese beiläufig verwenden "-Operation müssen Sie eine Verzweigungsanweisung im Switch-Anweisungsblock hinzufügen. Der Code muss wie folgt geändert werden


Codeanalyse: Verwenden Sie die obige Methode, um dem Rechner neue Funktionsoperationen hinzuzufügen. Dort sind die folgenden Vorgänge: Nachteile

添加分支语句

<?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();
            }
        }
    }
?>
Nach dem Login kopieren
①Sie müssen den Originalcodeblock ändern. Beim Ändern des Originalcodes kann es passieren, dass Sie den Originalcode versehentlich in den falschen ändern, um „neue Funktionen hinzuzufügen“

②Wenn Sie Ich möchte hinzufügen Es hat viele Funktionen, wie zum Beispiel: „Potenz“, „Quadratwurzel“, „Logarithmus“, „trigonometrische Funktion“, „Statistik“, oder fügen Sie einige programmiererspezifische Berechnungsfunktionen hinzu, wie zum Beispiel: Und, Oder, Nicht , Xor, Dies erfordert das Hinzufügen von N Verzweigungsanweisungen zur Switch-Anweisung. Stellen Sie sich vor, dass, wenn eine Berechnungsfunktion zwanzig oder dreißig Fallverzweigungsanweisungen enthält, der Code einen Bildschirm überschreitet. Nicht nur wird die Lesbarkeit des Codes stark eingeschränkt, sondern der Schlüssel liegt darin, dass andere, nicht verwandte Funktionen hinzugefügt werden müssen Erläuterung: Dies verringert die Ausführungseffizienz des Programms erheblich.

Lösung: Verwenden Sie OOP-Vererbungs- und Polymorphismus-Ideen



Hier wird die objektorientierte Vererbungsfunktion verwendet. Deklarieren Sie zunächst eine virtuelle Basisklasse , und dann Die Basisklasse gibt die Methode an, die die Unterklasse implementieren muss (getValue())

简单工厂模式的初步实现
 <?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();
             }
         }
     }
 ?>
Nach dem Login kopieren
Analyse: Durch die Verwendung objektorientierter Vererbungsfunktionen können wir das ursprüngliche Programm leicht erweitern, wie zum Beispiel: „Potenzierung“ , „Quadratwurzel“, „Logarithmen“, „Trigonometrische Funktionen“, „Statistik“ und so weiter.

Wir müssen nur eine weitere Klasse schreiben (diese Klasse erbt die virtuelle Basisklasse), die entsprechenden Funktionen in der Klasse vervollständigen (z. B. Leistungsberechnung) und den Kopplungsgrad erheblich reduzieren zukünftige Wartung und Erweiterung

<?php
    /**
     * 求余类(remainder)
     *
     */
    class OperationRem extends Operation {
        public function getValue($num1,$num2){
            return $num1%$num12;
        }
    }
?>
Nach dem Login kopieren
Es gibt immer noch ein ungelöstes Problem: Wie kann das Programm das entsprechende Objekt entsprechend der Bedienereingabe des Benutzers instanziieren?

Lösung: Verwenden Sie eine separate Klasse, um den Instanziierungsprozess zu implementieren.

Der Code lautet wie folgt:



<?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;
?>
Nach dem Login kopieren


Weitere verwandte Artikel, die die „Simple Factory Pattern“-Beispiele in PHP erklären, finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage