Flyweight è un design pattern strutturale. Lo usiamo quando un’istanza di una classe può essere utilizzata per fornire molte istanze “virtuali”.
Problema
Abbiamo un’applicazione per disegnare paesaggi e vogliamo aggiungere degli alberi. Nella nostra applicazione, gli alberi non fanno granché; hanno delle coordinate (X e Y) e la loro dimensione può variare dinamicamente, a seconda della loro età.
Un utente potrebbe voler inserire un sacco di alberi nel suo paesaggio, che potrebbe assomigliare al seguente:
Dopo aver rilasciato il nostro software, i nostri clienti si lamentano del fatto che, quando inseriscono molti alberi, l’applicazione diventa lenta…
Soluzione
Anziché avere tante istanze dell’oggetto Tree
, potremmo riprogettare il nostro sistema affinché vi sia una sola istanza di Tree
e un oggetto client TreeManager
che mantiene il loro stato. Questo è il pattern Flyweight!
Gli stati di tutti gli oggetti Tree
virtuali sono conservati nell’array treeArray
di TreeManager
.
Conseguenze
Vantaggi:
• riduce il numero di istanze di oggetti durante l’esecuzione, riducendo l’impatto sulla memoria;
• centralizza lo stato per molti oggetti “virtuali” in un unico punto.
Utilizzi:
• una classe ha molte istanze e queste possono essere controllate allo stesso modo.
Svantaggi:
• una volta implementato, non è possibile far sì che le singole istanze logiche della classe abbiano un comportamento indipendente dalle altre istanze.
Riferimenti
• Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides – Design Patterns. Elementi per il riuso di software a oggetti — © Pearson Education Inc. / © Pearson Paravia Bruno Mondadori, 1995-2008, pp. 195-206