Flyweight
Catégorie
Pattern structurel
Problème
Réduire l’utilisation de la mémoire en partageant autant de données que possible entre des objets similaires. Utile lorsque vous devez prendre en charge un grand nombre d’objets fins-granulaires qui sont trop intensifs en mémoire.
Solution
- Séparer l’état intrinsèque (partagé, invariant) de l’état extrinsèque (dépendant du contexte, unique)
- Créer une usine de flyweights qui met en cache et réutilise les objets flyweight
- Stocker l’état extrinsèque en dehors de l’objet flyweight
Structure
- Flyweight : Interface pour les objets flyweight ; définit des opérations acceptant l’état extrinsèque
- ConcreteFlyweight : Implémente Flyweight ; stocke l’état intrinsèque
- FlyweightFactory : Crée et gère les objets flyweight ; assure le partage
- Client : Stocke et calcule l’état extrinsèque ; le transmet aux opérations flyweight
Avantages clés
- Réduction massive de la mémoire — Partage de données entre de nombreux objets
- Création d’objets efficace — L’usine met en cache et réutilise les objets
Compromis
- Complexité — Nécessite une séparation soignée de l’état intrinsèque et extrinsèque
- Coût de calcul — Le transfert de l’état extrinsèque peut être coûteux
Quand l’utiliser
- Une application utilise un grand nombre d’objets
- Le coût de stockage est élevé car les objets sont trop similaires dans leur état
- La plupart de l’état des objets peut être rendu extrinsèque
- Peu de groupes d’objets peuvent être remplacés par des flyweights partagés