J'ai étudié les modèles de conception et suis tombé sur le modèle de poids de mouche. J'ai essayé de voir des opportunités d'utiliser le modèle dans mes applications, mais j'ai du mal à voir comment l'utiliser. De plus, quels sont les signes qu'un modèle de poids de mouche est utilisé lorsque je lis le code d'autres personnes?
Selon la définition, il dit:
Utilisez le partage pour prendre en charge efficacement un grand nombre d'objets à grain fin.
Si je l'ai bien lu, les dictionnaires et les tables de hachage pourraient être des instances de poids volants, est-ce exact?
Merci d'avance.
design-patterns
Jeremy E
la source
la source
Réponses:
Un exemple est dans les bibliothèques Java. Java a des types primitifs (par exemple
int
, qui est un entier 32 bits) et des wrappers pour eux (par exempleInteger
, qui encapsuleint
). Il existe des méthodes pour " encadrer " unint
dans unInteger
et déballer unInteger
dans unint
. Les wrappers sont nécessaires car les types primitifs ne sont pas des objets et ne peuvent donc par exemple pas être utilisés comme clés dansMap
s ou placés dansCollection
s.La méthode de boxe utilise un tableau d'objets flyweight comme une sorte de cache pour les
Integer
s correspondant auxint
valeurs comprises entre -128 et 127. Comme ce sont les valeurs les plus susceptibles d'être utilisées comme clés ou placées dans des collections, elle réduit l'allocation et l'utilisation de la mémoire. (S'il y a 5000000Integer
s représentant la valeur 0 flottant, cela utilise 5000000 fois plus de mémoire que la réutilisation de l'instance flyweight).la source
Graphique. En règle générale, une image raster (qui est l'épine dorsale de la plupart des graphiques informatiques de niveau consommateur) est peu coûteuse en CPU, mais coûteuse en mémoire pour travailler (ce qui est bien car la mémoire est bon marché mais le CPU est cher). Si cette image raster doit être répétée plusieurs fois dans le rendu d'une plus grande interface utilisateur (des icônes dans une application graphique Windows aux caractères d'une police dans un traitement de texte, aux textures sur les surfaces dans un jeu 3D), cela a beaucoup de sens pour chargez l'image en mémoire une fois et pointez-la simplement sur des objets très simples, peu coûteux à fabriquer et qui, eux-mêmes, ne prennent pas beaucoup de mémoire. Un sprite, qui est simplement un point dans l'espace graphique auquel une image doit être affichée, n'est qu'un point 3D et un pointeur de mémoire sur le premier pixel de l'image à utiliser. PEUT-ÊTRE qu'il inclut également les dimensions de la partie du fichier image sprite à utiliser, en termes graphiques ou de mémoire. Ces informations sont toutes très peu coûteuses à modifier, par exemple pour changer l'image ou l'emplacement du sprite, et cela peut être fait sans charger une nouvelle image à chaque fois, augmentant ainsi considérablement les performances du programme sous-jacent pour manipuler et afficher les parties appropriées du des images appropriées pour rendre une "scène" d'interface utilisateur complète.
la source
Les
Character
instances de plage ASCII dans Smalltalk sont des masselottes.Lorsque vous évaluez quelque chose comme
Character space
,Character class >> #value:
exécute:La variable de classe
CharacterTable
est initialisée comme ceci:Ainsi, lorsque vous créez une chaîne, les plages ASCII
Character
proviendrontCharacterTable
plutôt que d'être nouvellement créées à chaque fois.la source
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:
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,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.
la source