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
采用封装方式 <?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 ?>
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 '%': $result= $num1%$num2; break; //......省略...... } }catch (Exception $e){ echo "您输入有误:".$e->getMessage(); } } } ?>
②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(); } } } ?>
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; } } ?>
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 '+': 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; ?>
Weitere verwandte Artikel, die die „Simple Factory Pattern“-Beispiele in PHP erklären, finden Sie auf der chinesischen PHP-Website!