Heim  >  Artikel  >  Backend-Entwicklung  >  Erfahren Sie in einem Artikel mehr über das Flyweight-Muster in PHP

Erfahren Sie in einem Artikel mehr über das Flyweight-Muster in PHP

青灯夜游
青灯夜游nach vorne
2021-07-14 19:32:552814Durchsuche

Im vorherigen Artikel „Sprechen Sie über den Proxy-Modus in PHP (Forward-Proxy und Reverse-Proxy)“ wird Ihnen der Proxy-Modus in PHP vorgestellt.

Erfahren Sie in einem Artikel mehr über das Flyweight-Muster in PHP

Flying-Dollar-Modus, das Wort „fliegender Dollar“ hat auf Chinesisch eigentlich keine besondere Bedeutung, also müssen wir es aufschlüsseln und betrachten. „Xiang“ bedeutet Teilen und „Yuan“ bedeutet Elemente. Es scheint leicht zu verstehen, bestimmte Elemente zu teilen.

Gof-Klassendiagramm und Erklärung

GoF-Definition: Verwendung gemeinsamer Technologie zur effektiven Unterstützung einer großen Anzahl feinkörniger Objekte

GoF-Klassendiagramm

Erfahren Sie in einem Artikel mehr über das Flyweight-Muster in PHP

Implementierung

interface Flyweight
{
    public function operation($extrinsicState) : void;
}

class ConcreteFlyweight implements Flyweight
{
    private $intrinsicState = 101;
    function operation($extrinsicState) : void
    {
        echo '共享享元对象' . ($extrinsicState + $this->intrinsicState) . PHP_EOL;
    }
}

class UnsharedConcreteFlyweight implements Flyweight
{
    private $allState = 1000;
    public function operation($extrinsicState) : void
    {
        echo '非共享享元对象:' . ($extrinsicState + $this->allState) . PHP_EOL;
    }
}

Definieren Sie die Freigabeschnittstelle und ihre Implementierung. Beachten Sie, dass es hier zwei Implementierungen gibt: ConcreteFlyweigh teilt den Status, UnsharedConcreteFlyweight teilt nicht oder sein Status muss nicht geteilt werden

class FlyweightFactory
{
    private $flyweights = [];

    public function getFlyweight($key) : Flyweight
    {
        if (!array_key_exists($key, $this->flyweights)) {
            $this->flyweights[$key] = new ConcreteFlyweight();
        }
        return $this->flyweights[$key];
    }
}

Speichern Sie die Objekte, die gemeinsam genutzt werden müssen, und verwenden Sie sie als Fabrik um das erforderliche Freigabeobjekt zu erstellen, um sicherzustellen, dass es nur ein eindeutiges Objekt mit demselben Schlüsselwert gibt, wodurch die Kosten für die Erstellung desselben Objekts gespart werden

$factory = new FlyweightFactory();

$extrinsicState = 100;
$flA = $factory->getFlyweight('a');
$flA->operation(--$extrinsicState);

$flB = $factory->getFlyweight('b');
$flB->operation(--$extrinsicState);

$flC = $factory->getFlyweight('c');
$flC->operation(--$extrinsicState);

$flD = new UnsharedConcreteFlyweight();
$flD->operation(--$extrinsicState);

Der Clientaufruf ermöglicht die gemeinsame Nutzung des externen Status $extrinsicState zwischen jedem Objekt

  • Es ist ein bisschen interessant, dieser Modus Die Menge an Code ist nicht gering
  • Wenn eine Anwendung eine große Anzahl sehr ähnlicher Objekte verwendet und die meisten Zustände der Objekte in externe Zustände geändert werden können, ist sie sehr gut dafür geeignet Fliegengewichtsmuster
  • Die Fabrik speichert hier eine Liste von Objekten, nicht wie Fabrikmethoden oder abstrakte Fabriken. Obwohl die Erstellung auch hier erfolgt, wird das Objekt direkt zurückgegeben, wenn es existiert, und die Liste wird immer gepflegt
  • Flyweight-Modus In der Realität muss es jeder in gewissem Umfang verwendet haben: Verschiedene Pool-Technologien sind seine typischen Anwendungen: Thread-Pool, Verbindungspool usw. Die anderen beiden identischen String-String-Typen können === in PHP oder Java sein Zum Fliegengewichtsmodus sind die Speicheradressen nicht alle gleich. Es gibt ein äußerst klassisches Beispiel, das viel besser ist als das folgende Beispiel das Go-Board. Go hat nur zwei Farben: Schwarz und Weiß, also reichen zwei Objekte aus. Ändern Sie einfach ihren Standortstatus! Interessierte Freunde können danach suchen!
  • Der IoC-Container in Laravel kann als Implementierung des Flyweight-Musters angesehen werden. Es speichert das Objekt in einem Array und ruft es bei Bedarf über den Abschlussmechanismus ab. Es gibt auch einige Klassen, die einige Zustandsattribute gemeinsam haben. Sie können sich den Code ansehen, um ihn zu verstehen.
Reden wir darüber, dass Technologie auf dem Wechsel von Hüllen basiert. Schließlich möchte jeder immer noch Handys in verschiedenen Farben haben, um seine Persönlichkeit zu zeigen. Wie ich bereits sagte: Wäre das nicht eine riesige Investition, wenn wir für jede Farbe eine Produktionslinie bauen müssten? Glücklicherweise produziert unsere Fabrik (Xiangyuan-Fabrik) nur die grundlegendste Hintergrundhülle (Objekt) für jedes Modell und wird dann durch eine spezielle Drucklinie eingefärbt (Zustandsänderung)! Nun, das nächste iPhone wird uns früher oder später nachahmen. Es scheint, dass wir zuerst alle Arten von Gold und verschiedene satte Farben sammeln müssen. Vielleicht können wir auch den Drachen beschwören. !

Vollständiger Code: https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights.php

Beispiel

Wie erwartet sind wir hier sowieso Senden Textnachrichten, diesmal werden die Textnachrichten immer noch über Alibaba Cloud und Jiguang SMS gesendet, aber dieses Mal verwenden wir den Flyweight-Modus, um sie zu implementieren. In der Flyweight-Fabrik speichern wir hier zwei verschiedene Arten von Objekten, durch interne und externe Zustände. Lass sie sich ständig verändern!

SMS-Versandklassendiagramm

Erfahren Sie in einem Artikel mehr über das Flyweight-Muster in PHP

Vollständiger Quellcode: https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights-message.php

<?php

interface Message
{
    public function send(User $user);
}

class AliYunMessage implements Message
{
    private $template;
    public function __construct($template)
    {
        $this->template = $template;
    }
    public function send(User $user)
    {
        echo &#39;使用阿里云短信向&#39; . $user->GetName() . &#39;发送:&#39;;
        echo $this->template->GetTemplate(), PHP_EOL;
    }
}

class JiGuangMessage implements Message
{
    private $template;
    public function __construct($template)
    {
        $this->template = $template;
    }
    public function send(User $user)
    {
        echo &#39;使用极光短信向&#39; . $user->GetName() . &#39;发送:&#39;;
        echo $this->template->GetTemplate(), PHP_EOL;
    }
}

class MessageFactory
{
    private $messages = [];
    public function GetMessage(Template $template, $type = &#39;ali&#39;)
    {
        $key = md5($template->GetTemplate() . $type);
        if (!key_exists($key, $this->messages)) {
            if ($type == &#39;ali&#39;) {
                $this->messages[$key] = new AliYunMessage($template);
            } else {
                $this->messages[$key] = new JiGuangMessage($template);
            }
        }
        return $this->messages[$key];
    }

    public function GetMessageCount()
    {
        echo count($this->messages);
    }
}

class User
{
    public $name;
    public function GetName()
    {
        return $this->name;
    }
}

class Template
{
    public $template;
    public function GetTemplate()
    {
        return $this->template;
    }
}

// 内部状态
$t1 = new Template();
$t1->template = &#39;模板1,不错哟!&#39;;

$t2 = new Template();
$t2->template = &#39;模板2,还好啦!&#39;;

// 外部状态
$u1 = new User();
$u1->name = &#39;张三&#39;;

$u2 = new User();
$u2->name = &#39;李四&#39;;

$u3 = new User();
$u3->name = &#39;王五&#39;;

$u4 = new User();
$u4->name = &#39;赵六&#39;;

$u5 = new User();
$u5->name = &#39;田七&#39;;

// 享元工厂
$factory = new MessageFactory();

// 阿里云发送
$m1 = $factory->GetMessage($t1);
$m1->send($u1);

$m2 = $factory->GetMessage($t1);
$m2->send($u2);

echo $factory->GetMessageCount(), PHP_EOL; // 1

$m3 = $factory->GetMessage($t2);
$m3->send($u2);

$m4 = $factory->GetMessage($t2);
$m4->send($u3);

echo $factory->GetMessageCount(), PHP_EOL; // 2

$m5 = $factory->GetMessage($t1);
$m5->send($u4);

$m6 = $factory->GetMessage($t2);
$m6->send($u5);

echo $factory->GetMessageCount(), PHP_EOL; // 2

// 加入极光
$m1 = $factory->GetMessage($t1, &#39;jg&#39;);
$m1->send($u1);

$m2 = $factory->GetMessage($t1);
$m2->send($u2);

echo $factory->GetMessageCount(), PHP_EOL; // 3

$m3 = $factory->GetMessage($t2);
$m3->send($u2);

$m4 = $factory->GetMessage($t2, &#39;jg&#39;);
$m4->send($u3);

echo $factory->GetMessageCount(), PHP_EOL; // 4

$m5 = $factory->GetMessage($t1, &#39;jg&#39;);
$m5->send($u4);

$m6 = $factory->GetMessage($t2, &#39;jg&#39;);
$m6->send($u5);

echo $factory->GetMessageCount(), PHP_EOL; // 4

Erklärung

Der Code ist etwas umfangreich, aber tatsächlich gibt es zwei Arten von Klassen und es werden vier Arten von Objekten generiert. Hier werden verschiedene Objekte jeder Klasse anhand von Vorlagen unterschieden. Kombinieren Sie sie mit anderen Modi, um die Fabrik zu optimieren.
  • Der Flyweight-Modus eignet sich für Szenarien, in denen eine große Anzahl ähnlicher Objekte im System vorhanden ist und ein Pufferpool erforderlich ist. Er kann die Speichernutzung reduzieren und die Effizienz erhöhen, erhöht jedoch die Komplexität und erfordert die gemeinsame Nutzung interner und externer Zustände Das Hauptmerkmal ist, dass es ein eindeutiges Logo gibt. Wenn das Objekt bereits im Speicher vorhanden ist, wird das Objekt direkt zurückgegeben, ohne es erneut zu erstellen
  • Originaladresse: https://juejin.cn/post/6844903965814259726
  • Autor: Hardcore-Projektmanager
  • Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonErfahren Sie in einem Artikel mehr über das Flyweight-Muster 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