Dans l'article précédent "Parlez du mode proxy en PHP (proxy direct et proxy inverse)", nous avons présenté le mode proxy en PHP. Cet article vous amènera à comprendre le poids mouche dans le modèle de conception PHP.
Flying Dollar Mode, le mot "flying dollar" n'a en fait aucune signification particulière en chinois, nous devons donc le décomposer et l'examiner. « Xiang » signifie partage, et « Yuan » signifie éléments. Cela semble facile à comprendre, partager certains éléments.
Définition GoF : utiliser une technologie partagée pour prendre en charge efficacement un grand nombre d'objets à granularité fine
Diagramme de classes GoF
implémentation du code
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; } }
Définissez l'interface de partage et son implémentation, notez qu'il existe deux implémentations ici, ConcreteFlyweigh partage l'état, UnsharedConcreteFlyweight ne partage pas ou son état n'a pas besoin d'être partagé
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]; } }
Enregistrez les objets qui doivent être partagés et utilisez-le comme usine pour créer l'objet de partage requis, garantissant qu'il n'y aura qu'un seul objet avec la même valeur de clé, économisant ainsi le coût de création du même objet
$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);
L'appel client permet de partager l'état externe $extrinsicState entre chaque objet
Code complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights.php
Exemple
Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights-message.php
Explication<?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; // 4Copier après la connexionLe code est un peu trop long, mais en fait il existe deux types de classes et quatre types d'objets sont générés. Différents objets de chaque classe sont ici distingués en fonction de modèles. Cette combinaison est assez pratique. Combinez-la avec d'autres modes pour optimiser l'usine, vous pouvez y penser !
- Le mode Flyweight convient aux scénarios dans lesquels il existe un grand nombre d'objets similaires dans le système et où un pool de mémoire tampon est requis. Il peut réduire l'utilisation de la mémoire et améliorer l'efficacité, mais il augmentera la complexité et nécessitera le partage des états internes et externes. la principale caractéristique est qu'il y a un Logo unique, lorsque l'objet existe déjà dans la mémoire, l'objet est renvoyé directement sans le recréer
- Adresse originale : https://juejin.cn/post/6844903965814259726
- Auteur : Chef de projet hardcore
Apprentissage recommandé : "Tutoriel vidéo PHP"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!