Design Patterns PHP FlyWeight
modèle masselotte « masselotte » En chinois, le mot ne fournit aucune signification particulière, donc nous voulons le voir divisé. « Enjoy » est partagé, « Yuan » est l'élément, de sorte que semble être très facile à comprendre, partager quelques éléments de chose.
diagramme de classes Gof et explications
GoF Définition: Objet Utiliser le partage pour soutenir un grand nombre de grains fins
Figure classe GoF
code mise en œuvre
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éfinir l'interface commune et sa mise en œuvre, note qu'il ya deux implémentations, l'état partagé ConcreteFlyweigh, UnsharedConcreteFlyweight ne partagent pas ou que son état n'a pas besoin de partager
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];
}
}
Enregistrer les objets qui doivent être partagés, comme une usine pour créer un objet partagé besoins pour assurer qu'il y aura seulement un objet unique sous la même clé, le même objet qui a été créé pour économiser de l'argent
$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);
Appelez le client, de sorte que l'état externe extrinsicState de $ peut être partagée entre les différents objets
- Un peu dire, le montant de code qui ne peut pas les modèles trop petits
- Lorsqu'une application utilise un grand nombre d'objets très similaires, comme la plupart des objets peuvent être des changements d'état externes, il convient Flyweight
- Usine voici une liste des objets stockés, et non comme une méthode d'usine ou une usine abstraite pour créer des objets de même, bien qu'il y ait aussi été créé, mais si l'objet existe, le retour direct, mais la liste a également été maintenue
- modèle masselotte en réalité, combien doit nous avons utilisé une variété de la technologie cellulaire est son application typique: le pool de threads, pool de connexion, etc., comme les deux autres chaînes type String en php ou Java sont possibles == =, qui appliquent également au modèle Flyweight, ils ont même des adresses mémoire sont les mêmes, ce n'est pas une chose à part genre
- A propos de modèle Flyweight, il est un exemple très classique, bien mieux que l'exemple ci-dessous moi, il était sur l'échiquier. Aller noir et blanc, de sorte que les deux objets est assez, et maintenant? Changer leur statut de position Jiuhaola! amis intéressés peuvent Soso Ha!
- Le conteneur Laravel peut être considéré IoC pour réaliser un mode Flyweight. Il les objets stockés dans le tableau, par un mécanisme de fermeture pour l'accès en cas de besoin, il y a certaines classes ont des attributs partagent un état contenu. Vous pouvez consulter le code pour comprendre la compréhension.
Ou en matière de technologie pour excrétion orientée sur cette question. Après tout, nous aimons tous encore une variété de couleurs pour distinguer leur personnalité téléphones. Je l'ai dit, si nous devons faire pour chaque couleur d'une ligne de production, cela signifierait, un investissement énorme. Heureusement, chaque modèle de notre usine (usine Flyweight) ne produisent que la plus coquille d'arrière-plan de base (l'objet), puis à l'impression couleur sans mille millions par une ligne spéciale (changement d'état)! Ah, sous un iPhone tôt ou tard nous imiter, il semble que nous devons mettre toutes sortes d'or, de recueillir toutes sortes de tyrans locaux de travail couleur, il pourrait même appeler le dragon! !
Code complet: https://github.com/zhangyue0503/designpatterns-php/blob/master/13.flyweights/source/flyweights.php
Exemples
Sans surprise, nous venons vraiment textos, Ali nuage et aurora messages texte SMS utilisent encore cette fois-ci à envoyer, mais cette fois-ci, nous utilisons le modèle Flyweight pour atteindre, nous gagnons ici de l'usine Flyweight deux types différents Oh objet, à l'intérieur et à l'extérieur de l'état pour les laisser passer le toujours changer!
Figure SMS classe
Le code source complet: 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 '使用阿里云短信向' . $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
explication
- Le code un peu plus, mais en fait un total de deux types de classes, a généré quatre objets. Ici, chaque autre classe d'objet est un modèle pour distinguer
- Cette combinaison est assez facile maintenant, combiné avec un autre modèle d'optimisation de l'usine se penchera ici, ah, va se développer, vous pouvez penser Oh!
- Scène Flyweight grand nombre d'objets et des besoins similaires à appliquer au pool de mémoire tampon du système, il est possible de réduire la consommation de mémoire et d'améliorer l'efficacité, mais ajoute à la complexité, la nécessité de partager les états externes
- La principale caractéristique est un identifiant unique, lorsque la mémoire a été l'objet d'un retour direct à l'objet, ne vont pas créé