Detaillierte Erläuterung des PHP-Designmuster-Fabrikmusters

墨辰丷
Freigeben: 2023-03-26 13:50:01
Original
1404 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich das Fabrikmuster von PHP-Entwurfsmustern vor. Er stellt das Konzept und die Prinzipien des Fabrikmusters kurz vor und fasst die spezifische Definition und Verwendung des Fabrikmusters in Form von Beispielen zusammen dazu

Die Details lauten wie folgt:

Was ist der Zweck oder das Ziel der Verwendung des Fabrikmusters?

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 und kopieren Sie ihn und fügen Sie ihn ein. Die Kopplungsbeziehung ist wichtig 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 eingegeben werden geändert werden, was bedeutet, dass viel Aufrufcode geändert werden muss.

Der Vorteil des Fabrikmusters liegt in der Erstellung von Objekten.

Der Vorteil des Fabrikmusters 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.

Beim Erstellen 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, eine bestimmte Sache zu bestimmen, klassifizieren wir oft eine Kategorie von Dingen in eine abstrakte Kategorie.

Fabrikmethode:

Wenn Ihre Fabrik beispielsweise „Zigarettenfabrik“ heißt, dann kann es „Septwolves-Fabrik“, „China-Fabrik“ usw. geben. 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 „Serie“ von Produkten und nicht „ein einziges“, wie zum Beispiel „Zigaretten“ und „Bier“. Dann können auch bestimmte Fabriken daraus abgeleitet werden, aber diese Fabriken produzieren alle diese Produktreihe, 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. Der Schlüssel liegt darin, das Wesentliche zu erfassen: Solange verschiedene Klasseninstanzen basierend auf 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 bereits zuvor verwendet habe, ist es zum Verständnis besser, phpcms wie folgt zu verwenden:

pc_base:load_app_class("order"');//参数名称就是类名称。
Nach dem Login kopieren

generiert eine Instanz von Befehl . Die Übergabe verschiedener Parameter zum Abrufen verschiedener Klasseninstanzen entspricht dem Factory-Muster.

pc_base:load_app_class("comment"');//生成一个comment类实例
Nach dem Login kopieren

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 im Factory-Modus denke, 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)
Nach dem Login kopieren

in der Form

dynamisch eine Instanz für die Verbindung generieren zur Datenbank. Es kann MySQL sein oder mit Oracle verbunden sein.

class DbFactory
{
  function static factory($db_class_name)
  {
    $db_class_name = strtolower($db_class_name);
    if (include_once 'Drivers/' . $db_class_name . '.php') {
      $classname = 'Driver_' . $db_class_name;
      return new $db_class_name;
    } else {
      throw new Exception ('对应的数据库类没找到');
    } 
  }
}
DbFactory::factory("mysql");
DbFactory::factory("oracle");
Nach dem Login kopieren

Es gibt auch eine entsprechende Implementierung im thinkphp-Framework:

Db.class.php ist eine Factory-Klasse (kann auch aufgerufen werden Die mittlere Schicht der Datenbank wird als mittlere Schicht bezeichnet, da sie MySQL, Oracle und andere Datenbanken betreiben kann und es Programmierern ermöglicht, eine Verbindung zu MySQL und Oracle herzustellen für die Datenbank.

Es gibt eine factory()Methode in Db.class.php, um verschiedene Datenbankinstanzen

public function factory($db_config='') {
    // 读取数据库配置
    $db_config = $this->parseConfig($db_config);
    if(empty($db_config['dbms']))
      throw_exception(L('_NO_DB_CONFIG_'));
    // 数据库类型
    $this->dbType = ucwords(strtolower($db_config['dbms']));
    $class = 'Db'. $this->dbType;
    if(is_file(CORE_PATH.'Driver/Db/'.$class.'.class.php')) {
      // 内置驱动
      $path = CORE_PATH;
    }else{ // 扩展驱动
      $path = EXTEND_PATH;
    }
    // 检查驱动类
    if(require_cache($path.'Driver/Db/'.$class.'.class.php')) {
      $db = new $class($db_config);
      // 获取当前的数据库类型
      if( 'pdo' != strtolower($db_config['dbms']) )
        $db->dbType = strtoupper($this->dbType);
      else
        $db->dbType = $this->_getDsnType($db_config['dsn']);
      if(APP_DEBUG) $db->debug  = true;
    }else {
      // 类没有定义
      throw_exception(L('_NOT_SUPPORT_DB_').': ' . $db_config['dbms']);
    }
    return $db;
}
Nach dem Login kopieren

zu erstellen Wenn es um Schnittstellen geht, können sie in Zukunft verschiedenen Zahlungsgateways entsprechen: Alipay, Tenpay, Online-Banking usw. Um zukünftige Erweiterungen zu erleichtern, entwerfen Sie ein Fabrikmodell, das auf die Herstellung von Gateway-Schnittstellen spezialisiert ist, abstrahieren Sie es und erstellen Sie es In einem Schnittstellenformular müssen alle Unterklassen eine Zahlungsmethode hinzufügen und die Parameter ändern, um zu entscheiden, welche Zahlungsmethode verwendet werden soll Trick: Bei der Registrierung von Benutzern können Benutzer mit vielen Rollen, z. B. registrierte Benutzer, anonyme Benutzer, Administratorbenutzer usw., die Factory verwenden. Um die Idee umzusetzen, ist der Code einfach zu warten und die folgenden Klassen können generiert werden jede Rolle:

.

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


Verwandte Empfehlungen:

PHP Factory Pattern Use Cases and Analysis

PHP-Singleton- und Factory-Modus

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des PHP-Designmuster-Fabrikmusters. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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