Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Diskussion über das Factory-Methodenmuster in PHP

Eine kurze Diskussion über das Factory-Methodenmuster in PHP

青灯夜游
青灯夜游nach vorne
2021-06-17 18:21:122528Durchsuche

Dieser Artikel führt Sie durch das Factory-Methodenmuster in PHP-Entwurfsmustern. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Eine kurze Diskussion über das Factory-Methodenmuster in PHP

Wie letztes Mal erwähnt, gehört die einfache Fabrik nicht zu den dreiundzwanzig Designmustern von GoF. Diesmal ist es ein echter Kerl. Das berühmte „Factory Method Pattern“ ist hier zu berichten.

Verwandte Empfehlungen: „
Ein kurzer Vortrag über das einfache Factory-Muster in PHP


Erklärung des GoF-Klassendiagramms

Im Vergleich zur einfachen Fabrik besteht der Kernpunkt des Fabrikmethodenmusters darin, das zu verschieben Implementierung bis zur Unterklasse. Wie ist es zu verstehen? Wir können die einfache Factory vom letzten Mal als übergeordnete Klasse verwenden und sie dann von einer Reihe von Unterklassen erben lassen. Die Methode createProduct() wird auch zu einer abstrakten Methode in der übergeordneten Klasse. Dann implementieren alle Unterklassen diese Methode. Es ist nicht erforderlich, einen Schalter zur Beurteilung zu verwenden. Die Unterklasse kann ein instanziiertes Objekt direkt zurückgeben.

GoF-Definition: Definieren Sie eine Schnittstelle zum Erstellen von Objekten und lassen Sie Unterklassen entscheiden, welche Klasse instanziiert werden soll. Die Factory-Methode verschiebt die Instanziierung einer Klasse auf ihre Unterklassen.

GoF-Klassendiagramm:

Eine kurze Diskussion über das Factory-Methodenmuster in PHP

Produkt im Klassendiagramm ist das Produkt
  • Ersteller im Klassendiagramm ist der Ersteller
  • Die übergeordnete Erstellerklasse verfügt über eine abstrakte FactoryMethod()-Fabrikmethode
  • Alle Ersteller-Unterklassen müssen diese Factory-Methode implementieren und das entsprechende spezifische Produkt zurückgeben
  • Die übergeordnete Erstellerklasse kann über eine AnOperation()-Operationsmethode verfügen, um das Produkt direkt zurückzugeben. Sie können FactoryMethod() zum Zurückgeben verwenden, sodass dies nur von außen erforderlich ist um AnOperation einheitlich aufzurufen der Ersteller:
  • // 商品接口
    interface Product{
        function show() : void;
    }
    
    // 商品实现类A
    class ConcreteProductA implements Product{
        public function show() : void{
            echo "I'm A.\n";
        }
    }
  • Das ist dasselbe wie eine einfache Fabrik. Um den wesentlichen Unterschied zu verstehen, haben wir den ekligen Schalter entfernt und jede spezifische Implementierungsklasse Produktobjekte erstellen lassen. Das ist richtig, einzeln und geschlossen. Jede einzelne Ersteller-Unterklasse ist in der Fabrikmethode nur an ein Produkt gekoppelt. Ich weiß nicht, ob es andere Produkte und andere Fabriken gibt, die mit Kunden in dieser Unterklasse zusammengearbeitet haben.

Verwenden Sie auch die Analogie zu Mobiltelefonen: Ich bin ein Großhändler, der Mobiltelefone verkauft (Kunde, Geschäftsseite), und ich benötige eine Charge Mobiltelefone (Produkt A), also habe ich Foxconn (Factory Creator) gebeten, mir bei der Produktion zu helfen . Ich habe Foxconn meine Bedürfnisse erklärt und Foxconn hat zugestimmt, die Arbeit in meiner Hengyang-Fabrik (ConcreatorA) zu erledigen. Es besteht keine Notwendigkeit, zur Hauptfabrik zu gehen. Ihre kleine Bestellung ist nur eine Verschwendung. Dann, nach einer Weile, brauchte ich ein anderes Mobiltelefonmodell (Produkt B). Foxconn schaute es sich an und bat Zhengzhou Foxconn (Concrete Creator B), mir bei der Produktion zu helfen. Egal was passierte, sie gaben mir immer das entsprechende Mobiltelefon. Darüber hinaus weiß das Werk in Zhengzhou nicht, was das Werk in Hengyang produziert hat oder ob es mit mir zusammengearbeitet hat. Das alles wissen nur ich und das Hauptwerk.

Vollständiger Code: Factory-Methodenmuster

https://github.com/zhangyue0503/designpatterns-php/blob/master/02.factory/source/factory.php

Beispiel

Szene: Licht Wenn wir keine falschen Tricks anwenden und die Textnachrichten vom letzten Mal ändern, werden wir immer noch dieselben SMS-Anbieter wie beim letzten Mal verwenden. Schließlich ist es bereits jedem bekannt, aber in Zukunft muss es möglicherweise ersetzt werden. Einkaufszentren sind wie Schlachtfelder, und die Interessen aller sollten an erster Stelle stehen. In diesem Fall können wir es über das Factory-Methodenmuster entkoppeln und problemlos SMS-Anbieter hinzufügen und ändern.

SMS-Versandklassendiagramm

Code-Implementierung

// 创建者抽象类
abstract class Creator{

    // 抽象工厂方法
    abstract protected function FactoryMethod() : Product;

    // 操作方法
    public function AnOperation() : Product{
        return $this->FactoryMethod();
    }
}

// 创建者实现类A
class ConcreteCreatorA extends Creator{
    // 实现操作方法
    protected function FactoryMethod() : Product{
        return new ConcreteProductA();
    }
}

Vollständiger Quellcode: SMS-Versand-Factory-Methode

https://github.com/zhangyue0503/designpatterns-php/blob/master/02 .factory/source/factory-message.php

Eine kurze Diskussion über das Factory-Methodenmuster in PHP

Erklärung

Es ist grundsätzlich keine Erklärung für die Implementierung erforderlich die Unterklasse! !

Eine Factory-Unterklasse muss beim Aufrufen des Geschäfts gekoppelt werden. Dies ist in der Tat der Fall. Wenn Sie einen einheitlichen Aufruf wünschen, fügen Sie bitte eine einfache Factory hinzu. Halten Sie sich nicht an die aktuelle Form Klasse. Schnittstelle zum Definieren der Factory-Methode, Verlassen der getMessage()-Methode und direkten externen Aufruf der öffentlichen Vorlagenmethode (factoryMethod)

Empfohlenes Lernen: „

PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über das Factory-Methodenmuster in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen