Maison  >  Article  >  développement back-end  >  Modèle de conception PHP FlyWeight (modèle de poids mouche)

Modèle de conception PHP FlyWeight (modèle de poids mouche)

怪我咯
怪我咯original
2017-07-14 10:26:141448parcourir

En utilisant la technologie flyweight pour prendre en charge efficacement un grand nombre d'objets à grain fin, les amis dans le besoin peuvent s'y référer.

Flyweight PatternIl s'appelle "Flyweight Pattern" en anglais. Je suis très reconnaissant à la personne qui a traduit Flyweight Pattern en Flyweight Pattern, car ce mot rend claire la manière d'utiliser ce modèle. . Il est exprimé : s'il est traduit en mode poids plume ou en mode poids mouche, etc., bien qu'il puisse implicitement montrer le but de l'utilisation de ce mode, il lui manque toujours la clé de ce mode.

Le modèle Flyweight est défini comme : utiliser un partage pour éviter la surcharge liée à la possession d'un grand nombre d'objets avec le même contenu. Le problème le plus courant et le plus intuitif est la perte de mémoire. Le mode Flyweight prend en charge efficacement un grand nombre d’objets à granularité fine de manière partagée.

Avantages du mode poids mouche :

1) L'avantage du mode poids mouche est qu'il peut réduire considérablement le nombre d'objets en mémoire, de sorte que des objets identiques ou similaires n'existent que dans mémoire.

2) L'état externe du mode poids mouche est relativement indépendant et n'affectera pas son état interne, permettant aux objets poids mouche d'être partagés dans différents environnements.

Inconvénients du mode poids mouche :

1) Le mode poids mouche rend le système plus complexe et nécessite une séparation des états internes et externes, ce qui complique la logique du programme.

2) Afin de rendre l'objet partageable, le mode poids mouche doit externaliser l'état de l'objet poids mouche, et la lecture de l'état externe allonge le temps d'exécution.


Le concept fondamental du partage se reflète dans le nom et la définition, alors comment réaliser le partage ? Nous devons savoir que tout est différent, mais il existe certains points communs. Si seulement les mêmes choses peuvent être partagées, alors le modèle poids mouche est irréalisable, nous devrions donc faire de notre mieux pour partager les points communs tout en les conservant ; Sa personnalité. Pour y parvenir, le modèle poids mouche fait la distinction entre l’état intrinsèque et l’état extrinsèque. L’état intérieur est le commun et l’état extérieur est l’individualité.

Remarque : les objets partagés doivent être immuables, sinon toutes les modifications se produiront (sauf s'il existe une telle exigence).

L'état intrinsèque est stocké à l'intérieur du poids mouche et ne changera pas avec les changements dans l'environnement et peut être partagé ; l'état extrinsèque ne peut pas être partagé et change avec les changements dans l'environnement, donc l'état extrinsèque est maintenu par le client (car les changements dans l'environnement sont provoqués par le client). Dans chaque environnement spécifique, le client transmet l'état extrinsèque au poids mouche pour créer différents objets.

Tout d'abord, jetez un œil au programme ci-dessous pour avoir une compréhension générale du mode poids mouche.

<?php 
/** 
* 享元模式 
* 
* 运用享元技术有效的支持大量细粒度的对象 
*/ 
class CD 
{ 
private $_title = null; 
private $_artist = null; 
public function setTitle($title) 
{ 
$this->_title = $title; 
} 
public function getTitle() 
{ 
return $this->_title; 
} 
public function setArtist($artist) 
{ 
$this->_artist = $artist; 
} 
public function getArtist($artist) 
{ 
return $this->_artist; 
} 
} 
class Artist 
{ 
private $_name; 
public function construct($name) 
{ 
echo "construct ".$name."<br/>"; 
$this->_name = $name; 
} 
public function getName() 
{ 
return $this->_name; 
} 
} 
class ArtistFactory 
{ 
private $_artists = array(); 
public function getArtist($name) 
{ 
if(isset($this->_artists[$name])) 
{ 
return $this->_artists[$name]; 
} else { 
$objArtist = new Artist($name); 
$this->_artists[$name] = $objArtist; 
return $objArtist; 
} 
} 
} 
$objArtistFactory = new ArtistFactory(); 
$objCD1 = new CD(); 
$objCD1->setTitle("title1"); 
$objCD1->setArtist($objArtistFactory->getArtist(&#39;artist1&#39;)); 
$objCD2 = new CD(); 
$objCD2->setTitle("title2"); 
$objCD2->setArtist($objArtistFactory->getArtist(&#39;artist2&#39;)); 
$objCD3 = new CD(); 
$objCD3->setTitle("title3"); 
$objCD3->setArtist($objArtistFactory->getArtist(&#39;artist1&#39;));

Il existe trois essences du mode poids mouche :

  1. Objets à grain fin largement utilisés par le système, quelle doit être la finesse de la granularité , et quelle doit être la taille de la quantité. Il suffit de regarder le mode poids mouche utilisé dans jdk pour savoir quelle est sa taille. Dans jdk, Integer, Caractère, Chaîne, etc. utilisent tous le mode poids mouche. les types de données les plus basiques, ce n'est pas trop détaillé, ils participent fréquemment aux calculs, ce n'est pas trop gros.

  2. Divisez les attributs/état intrinsèques et les attributs/état extrinsèques de l'objet ; le soi-disant état intrinsèque est l'état qui existe à l'intérieur de l'objet et ne change pas avec l'environnement. Il y a un internaute C'est très bien dit, c'est l'état de non-différence, c'est-à-dire qu'il n'y a pas de différence entre des objets du même type une fois les attributs extrinsèques supprimés. L'état intrinsèque de l'objet est l'âme de l'objet. .Tant que l'âme et l'âme sont indiscernables, alors les objets le seront également. En même temps, seuls ces esprits indifférenciés peuvent être partagés. Je pense que c'est pourquoi Flyweight se traduit par flyweight. L'état extrinsèque est un état spécifié par le client et change avec l'environnement ; pour Integer, son attribut intrinsèque est en fait sa valeur (bien sûr il n'a pas d'attribut extrinsèque

  3. Utiliser un) ; factory pour contrôler la création de poids mouches ; car les objets poids mouche ne peuvent pas être créés à volonté par le client, sinon cela n'aura aucun sens. Les usines fournissent généralement un mécanisme de mise en cache pour enregistrer les masselottes déjà créées.

Orienté objetBien que cela résout bien le problème de l'abstraction, pour un système logiciel en cours d'exécution, nous devons également prendre en compte le coût de l'orientation objet. Le modèle de poids mouche résout le problème de coût orienté objet. Le mode Flyweight utilise le partage d'objets pour réduire le nombre d'objets dans le système, réduisant ainsi la pression mémoire que les objets à granularité fine apportent au système.

Le mode poids mouche n'est pas couramment utilisé dans le développement général de projets, mais est souvent utilisé dans le développement du système sous-jacent pour résoudre les problèmes de performances du système. Le type String en Java et .Net utilise le modèle flyweight. Si une chaîne objet s1 a été créée en Java ou .NET, alors la prochaine fois que la même chaîne s2 sera créée, le système pointera simplement la référence de s2 vers s1. objet spécifique référencé, qui réalise le partage de la même chaîne en mémoire. Si un nouvel objet chaîne est créé à chaque fois que l'opération s1="abc" est exécutée, la surcharge de mémoire sera très importante.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn