Lo scopo dell'uso del modello flyweight è quello di evitare un'inizializzazione degli oggetti non necessaria e quindi risparmiare spazio. Come definito da GOF , un oggetto può avere due stati, lo stato intrinseco e quello estrinseco:
- Stato intrinseco: è immagazzinato nel peso mosca; è costituito da informazioni indipendenti dal contesto dei pesi mosca, rendendole condivisibili.
- Stato estrinseco: dipende e varia a seconda del contesto del peso mosca e quindi non può essere condiviso. Gli oggetti client sono responsabili del passaggio dello stato estrinseco al peso mosca quando ne ha bisogno.
Supponendo che vogliamo sviluppare una semplice applicazione di editor di testo in cui ogni colonna contenga tutte le righe del testo e la riga possa contenere caratteri.
Il dilemma qui è come progettare la classe Character. Il char c
all'interno della classe personaggio dovrebbe essere il principale (stato intrinseca) dell'oggetto. Tuttavia, un carattere può avere un carattere e una dimensione (stato estrinseco); quindi abbiamo bisogno di memorizzare il suo stato estrinseco sulla riga (client) e accedervi quando necessario. A tale scopo, vengono creati due elenchi che memorizzano i caratteri e le dimensioni.
Seguendo il modello Flyweight, il personaggio è ora riutilizzabile e agli oggetti viene fatto riferimento da un elenco specifico di oggetti (il pool flyweight) che contiene tutti i simboli ASCII ( Character
oggetti).
Ecco cosa ho descritto visivamente:
Per stampare 'ciao', Character
sono necessari solo 4 oggetti, anziché 5. Una volta modificato il carattere, non sono necessari nuovi oggetti; nota che ciò non sarebbe possibile se avessimo memorizzato lo stato estrinseco nella classe Character, ad es.
class Character
{
char c;
int Size;
Font font;
....
}
L'applicazione di questo modello su set di dati di grandi dimensioni porterebbe a ottimizzazioni significative sulla complessità della memoria dell'applicazione e sulla riusabilità degli oggetti.