Heim > Artikel > Backend-Entwicklung > Erfahren Sie in einem Artikel mehr über das Flyweight-Muster in PHP
Im vorherigen Artikel „Sprechen Sie über den Proxy-Modus in PHP (Forward-Proxy und Reverse-Proxy)“ wird Ihnen der Proxy-Modus in PHP vorgestellt.
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-Definition: Verwendung gemeinsamer Technologie zur effektiven Unterstützung einer großen Anzahl feinkörniger Objekte
GoF-Klassendiagramm
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
Vollständiger Code: https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights.php
Beispiel
Vollständiger Quellcode: https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights-message.php
Erklärung<?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 '使用阿里云短信向' . $user->GetName() . '发送:'; 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 '使用极光短信向' . $user->GetName() . '发送:'; echo $this->template->GetTemplate(), PHP_EOL; } } class MessageFactory { private $messages = []; public function GetMessage(Template $template, $type = 'ali') { $key = md5($template->GetTemplate() . $type); if (!key_exists($key, $this->messages)) { if ($type == 'ali') { $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 = '模板1,不错哟!'; $t2 = new Template(); $t2->template = '模板2,还好啦!'; // 外部状态 $u1 = new User(); $u1->name = '张三'; $u2 = new User(); $u2->name = '李四'; $u3 = new User(); $u3->name = '王五'; $u4 = new User(); $u4->name = '赵六'; $u5 = new User(); $u5->name = '田七'; // 享元工厂 $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, 'jg'); $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, 'jg'); $m4->send($u3); echo $factory->GetMessageCount(), PHP_EOL; // 4 $m5 = $factory->GetMessage($t1, 'jg'); $m5->send($u4); $m6 = $factory->GetMessage($t2, 'jg'); $m6->send($u5); echo $factory->GetMessageCount(), PHP_EOL; // 4
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.
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!