Utilisateur
Utilizzare la condivisione per supportare un numero elevato di oggetti fini in modo efficiente, riducendo i costi di memoria e runtime.
Le strutture di oggetti complesse possono semplificare il design ma essere troppo costose in termini di memoria.
Un esempio è un editor di documenti che necessita di centinaia di migliaia di oggetti carattere, consumando memoria e creando overhead di runtime.
Flyweight consente di condividere oggetti per ridurre il numero totale di istanze.
Quando un'applicazione utilizza un numero elevato di oggetti.
Quando i costi di archiviazione sono elevati a causa del numero di oggetti.
Quando gran parte dello stato dell'oggetto può essere resa estrinseca.
Quando molti oggetti possono essere sostituiti da un numero ridotto di oggetti condivisi.
Quando l'applicazione non dipende dall'identità dell'oggetto.
Flyweight: Definisce un'interfaccia per ricevere e agire sullo stato estrinseco.
ConcreteFlyweight (es. Carattere): Implementa lo stato intrinseco condiviso; è indipendente dal contesto.
UnsharedConcreteFlyweight (es. Riga, Colonna): Alcuni oggetti non devono essere condivisi.
FlyweightFactory: Crea e gestisce oggetti Flyweight, assicurandosi che siano condivisi.
Client: Memorizza e passa lo stato estrinseco ai Flyweight.
Lo stato intrinseco è memorizzato in ConcreteFlyweight, mentre lo stato estrinseco è gestito dai client.
I client passano lo stato estrinseco al Flyweight al momento dell'uso.
I client ottengono i Flyweight esclusivamente tramite FlyweightFactory, che garantisce la condivisione.
Vantaggi:
Riduce il consumo di memoria condividendo gli oggetti.
Aumenta l'efficienza man mano che più Flyweight sono condivisi.
Riduce il numero di istanze necessarie per rappresentare grandi strutture di oggetti.
Svantaggi:
Può introdurre costi di runtime per calcolare o passare lo stato estrinseco.
La gestione della condivisione può aggiungere complessità.
Rimuovere lo stato estrinseco: Identificare e separare lo stato dipendente dal contesto, rendendolo esterno agli oggetti condivisi.
Gestire gli oggetti condivisi: Usare una FlyweightFactory per creare e recuperare oggetti Flyweight, evitando che i client li istanzino direttamente.
Condivisione permanente: Per oggetti con un numero fisso, mantenerli in memoria permanentemente, ad esempio i caratteri ASCII.
In applicazioni che necessitano di rappresentare grandi strutture di oggetti, come editor di testo o grafica vettoriale.
Composite: Per rappresentare strutture gerarchiche condivise.
State e Strategy: Per condividere strategie o stati comuni tra oggetti.