Lo scopo dell'utilizzo del modello del peso mosca è quello di evitare un'inizializzazione non necessaria dell'oggetto e quindi di risparmiare spazio. Come definito da GOF , un oggetto può avere due stati, quello intrinseco e quello estrinseco:
-
Intrinsic state: Is stored in the flyweight; it consists of information that's independent on the flyweights context, thereby
making it shareable.
-
Extrinsic state: depends on and varies with the flyweight's context and therefore cant be share. Client objects are responsible for
passing extrinsic state to the flyweight when it needs it.
Supponendo che vogliamo sviluppare una semplice applicazione di editor di testo in cui ogni colonna contiene tutte le righe del testo e la riga può contenere caratteri.
Il dilemma qui è come progettare la classe di caratteri. Il char c
all'interno della classe Carattere dovrebbe essere l'oggetto principale (stato intrinseco). Tuttavia, un char può avere un font 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 tipi di carattere e le dimensioni.
Seguendo il modello di peso mosca, il personaggio è ora riutilizzabile e gli oggetti vengono referenziati da un elenco specifico di oggetti (il pool del peso corporeo) che contiene tutti i simboli ASCII (% oggetti% co_de).
Ecco ciò che ho descritto visivamente:
Per stampare 'ciao', sono necessari solo il 4% di oggettiCharacter
, invece di 5. Una volta cambiato il carattere, non sono richiesti nuovi oggetti; nota che questo non sarebbe possibile se avessimo memorizzato lo stato estrinseco nella classe Character, ad esempio,
class Character
{
char c;
int Size;
Font font;
....
}
Applicare questo modello su serie di dati di grandi dimensioni porterebbe a significative ottimizzazioni sulla complessità della memoria dell'applicazione e alla riusabilità dell'oggetto.