Das Factory-Pattern von PHP verstehen

高洛峰
Freigeben: 2023-03-03 15:16:02
Original
1166 Leute haben es durchsucht

Factory-Klasse ist eine Klasse, die speziell zum Erstellen anderer Objekte verwendet wird. Die Factory-Klasse ist in der Praxis der polymorphen Programmierung sehr wichtig. Es ermöglicht den dynamischen Austausch von Klassen und die Änderung von Konfigurationen, wodurch die Anwendung flexibler wird. Die Beherrschung des Fabrikmusters ist für die Webentwicklung unerlässlich.

Das Fabrikmuster wird normalerweise verwendet, um verschiedene Klassen zurückzugeben, die Schnittstellen ähneln. Eine häufige Verwendung von Fabriken besteht darin, polymorphe Anbieter zu erstellen.

Normalerweise verfügt das Factory-Muster über ein Schlüsselkonstrukt, bei dem es sich um eine statische Methode handelt, die normalerweise Factory genannt wird. Diese statische Methode kann beliebig viele Parameter akzeptieren und muss ein Objekt zurückgeben.

Programmliste: Grundlegende Fabrikklasse

Klasse Fruit {
// Von der Fabrikklasse zurückgegebenes Objekt
}

Klasse FruitFactory {

public static functionfactory() {
// Eine neue Instanz des Objekts zurückgeben
return new Fruit();
}
}

/ / Rufen Sie die Fabrik auf
$instance = FruitFactory::factory();
?>

Programmliste: Verwenden Sie die Fabrikklasse, um Objekte zu produzieren

< ?php
Klassenbeispiel
{
// Die parametrisierte Factory-Methode
öffentliche statische Funktion Factory($type)
{
if (include_once 'Drivers/' . $type . ' .php' ) {
                                                                                                                                      
$sqlite = Beispiel::factory( 'SQLite');
?>


Programmliste: Eine vollständige Factory-Klasse

Das folgende Programm definiert einen General Factory-Klasse, die Produkte erzeugt, die Ihre speichern können. Ein leeres Objekt für alle Vorgänge, Sie können eine Instanz erhalten, und diese Vorgänge befinden sich in dieser Instanz.

   
   /**
    * Generische Factory-Klasse
    *
    * Diese Magic Factory merkt sich alle Operationen, die Sie daran ausführen,
    * und wendet sie auf das Objekt an, das sie instanziiert.
    *
   */
   class FruitFactory {
       private $history, $class, $constructor_args;
       
       /**
        * Erstellen Sie eine Factory einer bestimmten Klasse. Akzeptiert zusätzliche Argumente, die an den Klassenkonstruktor
        * übergeben werden.
       */
       function __construct( $class ) {
           $args = func_get_args();
           $this->class = $class;
           $this->constructor_ args = array_slice( $ args, 1 );
       }
       
       function __call( $method, $args ) {
           $this->history[] = array(
               'action'   => 'Anruf ',
               'method'    => $method,
               'args'   => $args
       }
      
       function __set( $property, $value ) {
           $this->history[] = array(
               'action'    => 'set',
               'property'    => $property,
              'Wert'        =>
           );
       }
       
       /**
        * Erstellt eine Instanz und führt alle Vorgänge aus, die auf dieser MagicFactory durchgeführt wurden
       */
       Funktionsinstanz() {
           # Verwenden Sie Reflection, um eine neue Instanz zu erstellen gs
$reflection_object = new ReflectionClass( $this->class );
           $object = $reflection_object->newInstanceArgs( $this->constructor_args );
           
           # Alternative Methode, die ReflectionClass nicht verwendet, aber keine Variable unterstützt
           # Anzahl der Konstruktorparameter.
           //$object = new $this->class();
           
           # Alle gespeicherten Vorgänge wiederholen und auf neues Objekt anwenden.
         foreach( $this->history as $item ) {
               if( $item['action'] == 'call' ) {
                   call_user_func_array( array( $object, $item['method'] ), $item['args'] );
               }
               if( $item['action'] == 'setzen' ) {
                   $object->{$item['property']} = $item['value'];
                          # Fertig
           $object zurückgeben ;
               ( $name, $color ) {
           $this->name = $name;
           $this->color = $color;
       }
       
       function setName( $name ) {
$ this->name = $name; }, der Preis beträgt {$this->price} RMB = new FruitFactory('Fruit', 'Apple', 'Gonn');
$fruit_factory->setName('Apple');
$fruit_factory->price = 2;

# Holen Sie sich eine Instanz
$apple = $fruit_factory->instance();
$apple->introduce();
?>


Ergebnis der Programmausführung:

Hallo, das ist ein Apple, der Preis beträgt 2 RMB.


Das Factory-Muster stellt hauptsächlich eine Übergangsschnittstelle zum Erstellen von Objekten bereit, um den spezifischen Prozess abzuschirmen und zu isolieren Erstellen von Objekten, um den Zweck der Verbesserung der Flexibilität zu erreichen.

Fabrikmuster können in drei Kategorien unterteilt werden:

Einfache Fabrik (Einfache Fabrik)

Fabrikmethode (Fabrikmethode)

Abstrakte Fabrikmuster (Abstrakt Factory)

Diese drei Modi werden nach und nach von oben nach unten abstrahiert und sind allgemeiner.

Einfaches Factory-Muster wird auch als statisches Factory-Methodenmuster bezeichnet. Aus der Umbenennung ist ersichtlich, dass dieser Modus sehr einfach sein muss. Sein Zweck ist einfach: eine Schnittstelle zum Erstellen von Objekten zu definieren. Das Factory-Methodenmuster entfernt die statischen Attribute der Factory-Methode im einfachen Factory-Muster und ermöglicht so deren Vererbung durch Unterklassen. Auf diese Weise kann der auf die Factory-Methode im einfachen Factory-Muster konzentrierte Druck auf verschiedene Factory-Unterklassen im Factory-Methodenmuster aufgeteilt werden.

Das Factory-Methodenmuster scheint die Erstellung von Objekten perfekt verpackt zu haben, sodass das Client-Programm nur die von der abstrakten Produktrolle bereitgestellte Schnittstelle verarbeitet. Müssen wir also überall im Code Fabriken haben? Keine Notwendigkeit. Möglicherweise können Sie die Verwendung des Factory-Methodenmusters in den folgenden Situationen in Betracht ziehen:

Wenn das Client-Programm den Erstellungsprozess des zu verwendenden Objekts nicht kennen muss.

Die vom Client-Programm verwendeten Objekte können sich ändern oder das spezifische verwendete Objekt ist möglicherweise überhaupt nicht bekannt.

Weitere Artikel zum Verständnis des PHP-Fabrikmusters Factory Pattern finden Sie auf der chinesischen PHP-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