Le but de l'utilisation du modèle flyweight est d'éviter l'initialisation inutile des objets et ainsi d'économiser de l'espace. Comme défini par GOF , un objet peut avoir deux états, l'état intrinsèque et l'état extrinsèque:
- État intrinsèque: est stocké dans la masselotte; il se compose d'informations indépendantes du contexte des masselottes, ce qui les rend partageables.
- État extrinsèque: dépend et varie selon le contexte de la masselotte et ne peut donc pas être partagé. Les objets clients sont responsables de la transmission de l'état extrinsèque à la masselotte lorsqu'elle en a besoin.
En supposant que nous voulons développer une application d'édition de texte simple où chaque colonne contient toutes les lignes du texte et la ligne peut contenir des caractères.
Le dilemme ici est de savoir comment concevoir la classe Character. L' char c
intérieur de la classe Character doit être l'objet principal (état intrinsèque). Cependant, un caractère peut avoir une police et une taille (état extrinsèque); nous devons donc stocker son état extrinsèque sur la ligne (client) et y accéder en cas de besoin. À cet effet, deux listes qui stockent les polices et les tailles sont créées.
En suivant le modèle Flyweight, le personnage est désormais réutilisable et les objets sont référencés à partir d'une liste spécifique d'objets (le pool de poids volants) qui contient tous les symboles ASCII ( Character
objets).
Voici ce que j'ai décrit visuellement:
Pour imprimer «bonjour», seuls 4 Character
objets sont nécessaires, au lieu de 5. Une fois la police modifiée, aucun nouvel objet n'est requis; notez que cela ne serait pas possible si nous avions stocké l'état extrinsèque sur la classe Character, par exemple,
class Character
{
char c;
int Size;
Font font;
....
}
L'application de ce modèle sur de grands ensembles de données entraînerait des optimisations importantes sur la complexité de la mémoire de l'application et la réutilisation des objets.