Die größte Switch/Case-Anweisung, die ich je in einem objektorientierten Programm gesehen habe, hatte über 20 Bedingungen. Zur Laufzeit führt dieses Codemodul jedes Mal alle Bedingungen aus. Jede Bedingung ist für die Erstellung eines neuen Objekts verantwortlich, das zur Kommunikation mit externen Benutzern der API der Anwendung verwendet wird. Nachdem ich bei einer davon einige allgemeine Fehlerbehebungen durchgeführt hatte, begann ich, mir die von der Anwendung implementierten Schnittstellen anzusehen. Zu meiner Überraschung implementiert jede Klasse, auf die in der switch/case-Anweisung verwiesen wird, dieselbe Schnittstelle! Beim späteren Hinzufügen neuer bedingter Anweisungen zur switch/case-Anweisung empfehle ich stattdessen die Verwendung des Factory-Musters.
Was ist ein Fabrikmuster?
Das Fabrikentwurfsmuster stellt eine Schnittstelle zum Abrufen einer neuen Instanz eines Objekts bereit und ermöglicht gleichzeitig dem aufrufenden Code, die Schritte zur tatsächlichen Instanziierung der Basisklasse nicht festzulegen.
Während PHP sich weiterentwickelt und zu einer Sprache entwickelt, bieten seine Funktionen weiterhin einfache Mittel zur Entwicklung durch die Anwendung bewährter Designmuster. Eine besonders nützliche Funktion in PHP ist die Möglichkeit, basierend auf dem Inhalt von Variablen neue Instanzen einer Klasse zu erstellen. Diese dynamische Methode der Objektinstanziierung ist ein Codeblock-Building-Ansatz zur Implementierung des Factory-Entwurfsmusters in PHP.
Klassen, die auf dem Factory-Design-Muster basieren, tragen dazu bei, die bedingungsbasierte Komplexität im Hauptcodefluss zu reduzieren. In einer Anwendung werden Objekte auf viele verschiedene Arten aufgerufen. Jede Änderung im Zusammenhang mit der Erstellung eines Objekts wirkt sich auf den Rest der Anwendung aus. Angenommen, Sie instanziieren eines von fünf Objekten, um einige Funktionen zu vervollständigen. Ein Ansatz besteht darin, bedingte Anweisungen zu erstellen, um zu bestimmen, welche Objekte instanziiert werden. Bedingte Anweisungen können komplexe if/else-Anweisungen oder switch/case-Anweisungen sein. Diese Funktionalität kann an vielen Stellen in der Anwendung verwendet werden, führt jedoch zu doppeltem Code. Wenn als nächstes ein sechstes Objekt hinzugefügt oder der Name eines der fünf vorhandenen Objekte geändert wird, müssen alle Instanzen des Programmcodes geändert und erneut getestet werden. Das Factory-Design-Muster hilft, dieses Problem zu vermeiden, indem es eine einfache Schnittstelle zum Erstellen der oben genannten Objekte bereitstellt. Unabhängig davon, ob das Objekt geändert oder andere Objekte hinzugefügt werden, wird das Factory-Objekt immer noch auf die gleiche Weise aufgerufen. Das Anzeigen eines Blogeintrags ist ein Anzeigebeispiel.
Die Erstellung verschiedener Objekte ist nicht der einzige Zweck der Verwendung des Fabrikdesignmusters. Ein weiterer Anwendungsfall für Klassen, die auf dem Factory-Entwurfsmuster basieren, ist die Arbeit mit Objektsammlungen. In diesem Fall enthält die Objektsammlung dasselbe Basisobjekt, aber jedes Objekt weist unterschiedliche Eigenschaften auf.
Wenn mehrere Schritte erforderlich sind, um den Typ des zu erstellenden Objekts zu bestimmen, ist es besser, eine Klasse zu verwenden, die auf dem Fabrikentwurfsmuster basiert, um neue Instanzen abzurufen.
UML
Dieses UML-Diagramm beschreibt detailliert einen Klassenentwurf unter Verwendung des Fabrikentwurfsmusters.
Das Folgende ist eine Beschreibung des obigen Bildes:
1 Die beiden vorhandenen Basisklassen sind MyObjectTyepA und MyObjectTyepB. Beide Minen verfügen über eine öffentliche Methode namens doSomething(), die objektspezifische Logik auf ihre eigene, einzigartige Weise ausführt. Die öffentlichen Schnittstellen und Rückgabetypen der beiden Basisklassen sind genau gleich.
2. Die MyObjectFactory-Klasse wird verwendet, um eine Instanz einer der oben genannten Basisklassen zu erstellen und sie an den Codefluss zurückzugeben. Es verfügt über eine öffentliche Methode namens createObject(), die einen Parametertyp akzeptiert, der dabei hilft, zu bestimmen, welche Basisklasseninstanz erstellt werden soll. Anschließend gibt die Methode createObject() eine Instanz der angeforderten Typklasse zurück.
Verwendungsbeispiele für PHP-Designmuster-Fabrikmuster
<?php /* * 每日练习 PHP设计模式工厂模式的使用方法 * PHP工厂模式不难理解,顾名思义,就是一个加工厂,然后工厂是制造产品的,只要制造产品 * 就必须有几个要素:"方法","模型","工厂车间"。 */ /*第一种示例 普通工厂模式 * */ abstract class model {//产品模型 abstract function getNames(); } class zhangsan extends model {//产品实例 function getNames(){ return "my name is zhengsan"; } } class lisi extends model{//产品实例 function getNames(){ return "my name is lisi"; } } abstract class gongchangModel {//工厂模型 abstract function getZhangsan(); abstract function getLisi(); } class gongchang extends gongchangModel{//工厂实例 function getZhangsan(){ return new zhangsan(); } function getLisi(){ return new lisi(); } } $gongchang=new gongchang();//实例化工厂 $zhangsan=$gongchang->getZhangsan();//制造产品 echo $zhangsan->getNames();//产品输出功能 ?>
Ich habe zuvor einen Artikel über das Fabrikdesignmuster geschrieben. Tatsächlich umfasst das Fabrikmuster das gewöhnliche Fabrikmuster und das abstrakte Fabrikmuster , aber egal um welches Factory-Muster es sich handelt, sie haben alle eine Funktion, nämlich die Generierung von Objekten.
Okay, verwenden wir das einfachste Beispiel unten, um das Factory-Muster im PHP-Entwurfsmuster zu demonstrieren.
Ich habe die drei Elemente des Fabrikmodells zusammengefasst:
1. Produktmodell
3
Das obige ist der detaillierte Inhalt vonPHP-objektorientierte erweiterte Entwurfsmuster: Beispiele für die Verwendung von Fabrikmustern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!