Heim >Backend-Entwicklung >PHP-Tutorial >Zusammenfassung der Anwendungsbeispiele des PHP-Factory-Musters

Zusammenfassung der Anwendungsbeispiele des PHP-Factory-Musters

黄舟
黄舟Original
2017-09-02 09:12:382038Durchsuche

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

Das Beispiel in diesem Artikel beschreibt das Fabrikmuster des PHP-Entwurfsmusters. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

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

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 Code aufgerufen werden muss. Alle müssen geändert werden.

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 statt „eines“, wie zum Beispiel „Zigaretten“ und „Bier“. 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 bereits zuvor verwendet habe, ist es zum Verständnis besser, phpcms wie folgt zu verwenden:


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

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


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

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)

in der Form

dynamisch eine Instanz generieren, mit der wir eine Verbindung herstellen können die 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");

Es gibt auch eine entsprechende Implementierung im thinkphp-Framework:

Db.class.php ist eine Factory-Klasse (kann auch aufgerufen werden Datenbank-Mittelschicht, wird als mittlere Schicht bezeichnet, da sie MySQL, Oracle und andere Datenbanken betreiben kann. Diese Klasse ist die mittlere Schicht, die die spezifische Implementierung abschirmt und es Programmierern ermöglicht, eine Verbindung zu MySQL, Oracle usw. herzustellen, ohne den ursprünglichen Abfragecode zu ändern . Datenbank.

Es gibt eine factory() Methode zum Erstellen verschiedener 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;
}

sowie eine Zahlung Schnittstelle In Zukunft kann es verschiedenen Zahlungsgateways entsprechen: Alipay, Tenpay, Online-Banking usw. Um zukünftige Erweiterungen zu erleichtern, entwerfen Sie eine Fabrik speziell für die Produktion von Gateway-Schnittstellen, abstrahieren Sie sie und machen Sie sie zu Schnittstellen Implementieren Sie die Schnittstelle. Wenn Sie später eine Zahlungsmethode hinzufügen, ändern Sie einfach die Parameter

.

Das Buch 4108b714f7c3d0f728383a09d933f293 (englischer Name ist PHP 5 Power Programming) erwähnt auch ein Beispiel für den Factory-Modus. Ich habe einen Trick gelernt: Teilen Sie sie bei der Registrierung in Benutzer mit vielen Rollen 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 mit verschiedenen Rollen: registrierte Benutzerklasse, anonyme Benutzerklasse, Administrator-Benutzerklasse

Das obige ist der detaillierte Inhalt vonZusammenfassung der Anwendungsbeispiele des PHP-Factory-Musters. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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