Flyweight

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