Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung des PHP-Entwurfsmusters – Factory-Muster

Zusammenfassung des PHP-Entwurfsmusters – Factory-Muster

高洛峰
高洛峰Original
2016-12-17 10:35:31943Durchsuche

Was ist der Zweck oder das Ziel der Verwendung von Fabrikmustern?

Der größte Vorteil des Factory-Musters liegt in der Objekterstellung, nämlich der Kapselung des Objekterstellungsprozesses, sodass jederzeit ein neues Objekt generiert werden kann.
Reduzieren Sie den Code, kopieren Sie ihn und fügen Sie ihn ein. Die Kopplungsbeziehung ist stark und wirkt sich auf andere Teile des Codes aus.

Um es für den Laien auszudrücken: Früher hat man „new“ verwendet, um ein Objekt zu erstellen, aber jetzt ist dieser Prozess gekapselt.
Angenommen, der Factory-Modus wird nicht verwendet: Dann wird an vielen Stellen Klasse a aufgerufen und der Code erstellt eine Instanz wie diese: new a() Angenommen, eines Tages muss der Name der Klasse a geändert werden. Das bedeutet, dass viele Aufrufcodes geändert werden müssen.

Der Vorteil des Fabrikmusters liegt in der Erstellung von Objekten.
Der Vorteil des Factory-Musters liegt in der Erstellung von Objekten. Richten Sie eine Factory (eine Funktion oder eine Klassenmethode) ein, um neue Objekte zu erstellen. Ihre Aufgabe besteht darin, den Objekterstellungsprozess zu kapseln.
Bei der Erstellung von Objekten werden keine neuen Objekte verwendet. Definieren Sie stattdessen eine Methode zum Erstellen von Objektinstanzen.

Jede Klasse muss möglicherweise eine Verbindung zur Datenbank herstellen. Kapseln Sie dann die Verbindung zur Datenbank in einer Klasse. Verwenden Sie in Zukunft Klassennamen in anderen Klassen:

Warum abstrakte Konzepte einführen?
Denken Sie darüber nach: Wenn wir im wirklichen Leben nicht in der Lage sind, etwas Bestimmtes zu bestimmen, ordnen wir eine Kategorie von Dingen oft einer abstrakten Kategorie zu.
Fabrikmethode:
Wenn Ihre Fabrik beispielsweise „Zigarettenfabrik“ heißt, kann sie „Septwolves-Fabrik“, „China-Fabrik“ usw. haben. Diese Fabrik produziert jedoch nur ein Produkt: Zigaretten
Abstrakte Fabrik: Es ist unmöglich zu beschreiben, welche Produkte sie produziert. Sie produziert viele Arten von Produkten (die abstrakte Fabrik generiert also Unterfabriken).
Ihre Fabrik ist umfassend und produziert „eine Reihe“ von Produkten statt „eines“, wie zum Beispiel: „Zigaretten“ und „Bier“ usw. Dann können auch bestimmte Fabriken daraus abgeleitet werden, aber diese Fabriken produzieren alle diese Produktserie, aber der Geschmack kann aufgrund unterschiedlicher Regionen und zur Anpassung an den lokalen Geschmack unterschiedlich sein.
Fabrikmuster: verstanden als eine Fabrik, die nur ein Produkt erzeugt. Zum Beispiel diejenigen, die Zigaretten herstellen.
Fabrikmethode: eine Produktproduktionslinie in der Fabrik. Zum Beispiel der Tastaturgenerierungsprozess.

Andere werden widerlegen: Ich habe nichts zu tun, wenn ich satt bin, also muss ich den Klassennamen ändern? Vielleicht. Im Allgemeinen werden Klassennamen nicht geändert.

Tatsächlich gibt es viele Variationen des Factory-Musters, und das Erfassen des Wesens ist der Schlüssel: Solange verschiedene Klasseninstanzen gemäß unterschiedlichen Parametern generiert werden können, entspricht dies der Designidee von ​​das Fabrikmuster.

Das erinnert mich daran, dass es im Framework oft Methoden gibt, die für die Generierung bestimmter Klasseninstanzen zum Aufruf verantwortlich sind.

Da ich phpcms schon einmal verwendet habe, ist es besser, phpcms zum besseren Verständnis wie folgt zu verwenden:

pc_base:load_app_class("order"');//Der Parametername ist die Klasse Name. Es wird eine Auftragsinstanz generiert. Die Übergabe verschiedener Parameter zum Abrufen verschiedener Klasseninstanzen entspricht dem Factory-Muster.
pc_base:load_app_class("comment"');//Generieren Sie eine Kommentarklasseninstanz

//Natürlich beinhaltet die Methode load_app_class auch die Idee des Singleton-Modus. Vermeiden Sie es, n-mal aufzurufen und wiederholt n identische Instanzen zu erstellen


Eine typische Anwendung, die ich mir im Factory-Modus vorstelle, ist: PHP muss möglicherweise eine Verbindung zu MySQL herstellen, oder es muss möglicherweise eine Verbindung zu SQL Server oder anderen Datenbanken herstellen . Erstellen Sie dann eine abstrakte Datenbankklasse.

Diese Klasse ist eine Factory-Klasse, die für die Generierung verschiedener Objekte verantwortlich ist.

Dies ist sehr praktisch für die Erweiterung. Wenn wir uns direkt mit der Datenbank verbinden, können wir statt des Codes new Mysql ($host, $username, $password, $dbname)

dynamisch eine Instanz generieren, um eine Verbindung mit der Datenbank herzustellen. Es kann MySQL sein oder mit Oracle verbunden sein.

Klasse DbFactory
{

Funktion statische Fabrik($db_class_name)
{

$db_class_name = strtolower($db_class_name);

if (include_once 'Drivers/' . $db_class_name . '.php') {

                                                                             } else {
            neue Ausnahme auslösen ('Die entsprechende Datenbankklasse wurde nicht gefunden');
DbFactory::factory("mysql");

DbFactory::factory("oracle");


hat auch ein Gegenstück in der Thinkphp-Framework-Implementierung:

Db.class.php ist eine Factory-Klasse (sie kann auch als mittlere Schicht der Datenbank bezeichnet werden). Sie wird als mittlere Schicht bezeichnet, da sie MySQL, Oracle und andere Datenbanken betreiben kann. Diese Klasse ist die mittlere Schicht. , Schild die spezifische Implementierung. Ermöglichen Sie Programmierern, die mittlere Ebene mit MySQL, Oracle und anderen Datenbanken zu verbinden. Es gibt eine Factory()-Methode in Db.class.phpöffentliche Funktionsfabrik ($db_config='') {
                                                                                                                                                  $db_config. =                    ])
                                                                              throw_Exception(L('_NO_DB_CONFIG_')); $class = 'Db'.
if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
// Eingebauter Treiber strtolower ($ db_config ['dbms'])
$ db- & gt; dBtype = strtoupper ($ this- & gt; dbType);
sonst
$db->dbType = $this-& gt; _getDsnType($db_config['dsn']);
                                                                                                                                                                  Exception(L('_NOT_SUPPORT_ DB_ ').': ' . $db_config['dbms'] );
                                                             return $db; Entspricht verschiedenen Zahlungsgateways: Alipay, Tenpay, Online-Banking usw. Um zukünftige Erweiterungen zu erleichtern, ist es im Werksmodus konzipiert. Definieren Sie eine Fabrik, die sich auf die Herstellung von Gateway-Schnittstellen spezialisiert hat, abstrahieren Sie sie und machen Sie daraus eine Schnittstellenform, sodass alle Unterklassen ihre Schnittstelle implementieren müssen. Wenn Sie in Zukunft eine Zahlungsmethode hinzufügen, welche Zahlungsmethode Sie verwenden möchten, ändern Sie einfach die Parameter.


Das Buch (englischer Name ist PHP 5 Power Programming) erwähnte auch einen Trick: Teilen Sie Benutzer bei der Registrierung in viele Benutzerrollen auf . Wie registrierte Benutzer, anonyme Benutzer, Administratorbenutzer usw. Mit der Idee der Fabriken kann eine vollständige Nutzung erreicht werden, der Code ist zudem einfach zu warten und für jede Rolle können Operationsklassen generiert werden.

Definieren Sie die folgenden Klassen:

UserFactory Benutzerfabrikklasse, verantwortlich für die Generierung verschiedener Benutzerklassen
Benutzer: Die Basisklasse der Benutzerklassen, alle Benutzerklassen erben diese Klasse
Klassen für verschiedene Rollen: registrierte Benutzerklasse, anonyme Benutzerklasse, Administrator-Benutzerklasse







Mehr PHP-Entwurfsmusterzusammenfassung-Factory Für musterbezogen Artikel, achten Sie bitte auf die chinesische PHP-Website!

Stellungnahme:
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