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

Exemples

  • Java
  • Les systèmes de rendu de polices partagent les données de glyphes entre les instances de texte
  • Python