Heim  >  Artikel  >  Backend-Entwicklung  >  Lassen Sie uns über das abstrakte Factory-Muster in PHP sprechen

Lassen Sie uns über das abstrakte Factory-Muster in PHP sprechen

青灯夜游
青灯夜游nach vorne
2021-06-21 18:29:252705Durchsuche

In diesem Artikel lernen Sie das abstrakte Fabrikmuster in PHP-Entwurfsmustern kennen. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.

Lassen Sie uns über das abstrakte Factory-Muster in PHP sprechen

Das Highlight der Factory Pattern-Serie ist da, ja, das ist das gemunkelte Abstract Factory Pattern. Wie haben Sie sich gefühlt, als Sie den Namen zum ersten Mal gehört haben? Jedenfalls finde ich, dass dieses Ding sehr hochwertig sein sollte, schließlich enthält es das Wort „abstrakt“. Es wird gesagt, dass diese beiden Wörter in der Entwicklung wirklich ein hohes Entwicklungsniveau haben. Wenn sie zusammen mit dem Wort „abstrakt“ verwendet werden, scheint alles sehr mächtig zu sein. Allerdings kann man Abstract Factory tatsächlich als den großen Bruder des Fabrikmusters bezeichnen.

Gof-Klassendiagramm und Erklärung

Solange Sie das Factory-Methodenmuster verstehen, ist es tatsächlich einfach, das abstrakte Factory-Muster zu verstehen. Wie sagt man es? Es ist immer noch die gleiche Verzögerung für Unterklassen und es ist immer noch die gleiche Rückgabe des angegebenen Objekts. Es ist nur so, dass die abstrakte Fabrik nicht nur ein Objekt zurückgibt, sondern eine Reihe davon.

GoF-Definition: Bietet eine Schnittstelle zum Erstellen einer Reihe verwandter oder voneinander abhängiger Objekte, ohne deren spezifische Klassen anzugeben.

GoF-Klassendiagramm:

Lassen Sie uns über das abstrakte Factory-Muster in PHP sprechen

  • Auf der linken Seite befinden sich zwei Fabriken 1 und 2, die beide eine abstrakte Fabrik erben und die Methoden CreateProductA und CreateProductB implementieren
  • Fabrik 1 produziert ProduktA1 und ProduktB1
  • Ebenso Fabrik 2 produziert ProduktA2 und ProduktB2
// 商品A抽象接口
interface AbstractProductA
{
    public function show(): void;
}

// 商品A1实现
class ProductA1 implements AbstractProductA
{
    public function show(): void
    {
        echo 'ProductA1 is Show!' . PHP_EOL;
    }
}
// 商品A2实现
class ProductA2 implements AbstractProductA
{
    public function show(): void
    {
        echo 'ProductA2 is Show!' . PHP_EOL;
    }
}

// 商品B抽象接口
interface AbstractProductB
{
    public function show(): void;
}
// 商品B1实现
class ProductB1 implements AbstractProductB
{
    public function show(): void
    {
        echo 'ProductB1 is Show!' . PHP_EOL;
    }
}
// 商品B2实现
class ProductB2 implements AbstractProductB
{
    public function show(): void
    {
        echo 'ProductB2 is Show!' . PHP_EOL;
    }
}

Produktimplementierung. Diesmal gibt es tatsächlich vier Produkte, nämlich A1, A2, B1 und B2 Beziehung zwischen A1 und B1 sind ähnliche verwandte Produkte, B1 und B2 sind ähnliche verwandte Produkte

// 抽象工厂接口
interface AbstractFactory
{
    // 创建商品A
    public function CreateProductA(): AbstractProductA;
    // 创建商品B
    public function CreateProductB(): AbstractProductB;
}

// 工厂1,实现商品A1和商品B1
class ConcreteFactory1 implements AbstractFactory
{
    public function CreateProductA(): AbstractProductA
    {
        return new ProductA1();
    }
    public function CreateProductB(): AbstractProductB
    {
        return new ProductB1();
    }
}

// 工厂2,实现商品A2和商品B2
class ConcreteFactory2 implements AbstractFactory
{
    public function CreateProductA(): AbstractProductA
    {
        return new ProductA2();
    }
    public function CreateProductB(): AbstractProductB
    {
        return new ProductB2();
    }
}
Und unsere Fabrik ist auch Fabrik 1 und Fabrik 2, Fabrik 1 produziert zwei verwandte Produkte, A1 und B1. Für die verknüpften Produkte produziert Fabrik 2 zwei Produkte, A2 und B2. Okay, ich weiß, dass es hier noch etwas abstrakt ist, und ich verstehe vielleicht immer noch nicht, warum das so ist. Nehmen wir weiterhin die Mobiltelefonproduktion als Beispiel.

Unsere Mobiltelefonmarke ist populär geworden, daher werden auch die Peripherieprodukte wie Handyfolien und Handyhüllen an Abstract Factory übergeben, um mir zu helfen. Wie beim letzten Mal erwähnt, habe ich bereits mehrere verschiedene Arten von Mobiltelefonen, daher werde ich wie bisher das Mobiltelefonmodell 1001 (Produkt A1) und gleichzeitig die Mobiltelefonfolie (Produkt B1) produzieren Die Handyhülle des Modells 1001 (Produkt B1) wird ebenfalls in der Fabrik in Hengyang hergestellt. Das Mobiltelefonmodell 1002 (ProduktA2) befindet sich noch in der Fabrik in Zhengzhou (Fabrik2), daher sollten die Mobiltelefonfolie (ProduktB2) und die Mobiltelefonfolie (ProduktC2) dieses Modells ihnen überlassen werden. Also habe ich gerade eine Bestellung bei der Hauptfabrik aufgegeben. Sie haben verschiedene Fabriken gebeten, einen kompletten Satz Mobiltelefonprodukte für mich herzustellen, und ich konnte den Satz direkt verkaufen! !

Vollständiger Code: Abstraktes Fabrikmuster

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

Beispiel

Ist dir immer noch etwas schwindelig, nachdem du das gesehen hast? Um es einfach auszudrücken: Es geht eigentlich nur darum, verschiedene Objekte über verschiedene Methoden in einer Factory-Klasse zurückzugeben. Lassen Sie uns das noch einmal am Beispiel des SMS-Versands erklären! Szenario: Diesmal haben wir eine geschäftliche Notwendigkeit, nicht nur Textnachrichten zu versenden, sondern gleichzeitig auch eine Push-Nachricht zu versenden. Der Zweck von Textnachrichten besteht darin, Benutzer über neue Aktivitäten zu informieren, an denen sie teilnehmen können, während Push-Benachrichtigungen Benutzer nicht nur über neue Aktivitäten informieren, sondern sie können auch direkt darauf klicken, um rote Umschläge zu erhalten. Ist das nicht aufregend? Glücklicherweise verfügen die von uns zuvor ausgewählten Cloud-Dienstanbieter alle über SMS- und Push-Schnittstellen, daher werden wir zur Implementierung nur die abstrakte Fabrik verwenden!

SMS-Versandklassendiagramm

<?php

interface Message {
    public function send(string $msg);
}

class AliYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;阿里云短信(原阿里大鱼)发送成功!短信内容:&#39; . $msg;
    }
}

class BaiduYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;百度SMS短信发送成功!短信内容:&#39; . $msg;
    }
}

class JiguangMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;极光短信发送成功!短信内容:&#39; . $msg;
    }
}

interface Push {
    public function send(string $msg);
}

class AliYunPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return &#39;阿里云Android&iOS推送发送成功!推送内容:&#39; . $msg;
    }
}

class BaiduYunPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return &#39;百度Android&iOS云推送发送成功!推送内容:&#39; . $msg;
    }
}

class JiguangPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return &#39;极光推送发送成功!推送内容:&#39; . $msg;
    }
}


interface MessageFactory{
    public function createMessage();
    public function createPush();
}

class AliYunFactory implements MessageFactory{
    public function createMessage(){
        return new AliYunMessage();
    }
    public function createPush(){
        return new AliYunPush();
    }
}

class BaiduYunFactory implements MessageFactory{
    public function createMessage(){
        return new BaiduYunMessage();
    }
    public function createPush(){
        return new BaiduYunPush();
    }
}

class JiguangFactory implements MessageFactory{
    public function createMessage(){
        return new JiguangMessage();
    }
    public function createPush(){
        return new JiguangPush();
    }
}

// 当前业务需要使用阿里云
$factory = new AliYunFactory();
// $factory = new BaiduYunFactory();
// $factory = new JiguangFactory();
$message = $factory->createMessage();
$push = $factory->createPush();
echo $message->send(&#39;您已经很久没有登录过系统了,记得回来哦!&#39;);
echo $push->send(&#39;您有新的红包已到帐,请查收!&#39;);

Vollständiger Quellcode: SMS-VersandfabrikmethodeLassen Sie uns über das abstrakte Factory-Muster in PHP sprechen

https://github.com/zhangyue0503/designpatterns-php/blob/master/03.abstract-factory/source / abstract-factory-message-push.php

Beschreibung

Ist es sehr klar?

Richtig, wir haben zwei Produkte, eines ist Message und das andere ist Push, die zum Senden von Nachrichten bzw. zum Senden von Push-Nachrichten dienen.
  • Die abstrakte Fabrik erfordert lediglich, dass unsere Schnittstellenimplementierer zwei Methoden implementieren und zum Senden von Textnachrichten zurückkehren und das Versenden von Push-Nachrichten.
  • Du hast gesagt, ich möchte nur Textnachrichten und keine Push-Benachrichtigungen senden, ist das in Ordnung? Natürlich können Sie das tun, rufen Sie einfach nicht die Methode createPush() auf.
  • Für welches Szenario eignet sich die abstrakte Fabrik am besten? Offensichtlich die Erstellung einer Reihe verwandter Objekte
  • Das Fabrikmethodenmuster ist der Kern der abstrakten Fabrik. Dies entspricht der Einführung mehrerer Fabrikmethoden in eine große Fabrik, um stattdessen einen vollständigen Satz von Produkten (einschließlich Peripheriegeräten) herzustellen ein einzelnes Produkt
  • Empfohlenes Lernen: „
  • PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonLassen Sie uns über das abstrakte Factory-Muster in PHP sprechen. 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