Intento:
Sfrutta la condivisione al fine di supportare un vasto numero di oggetti molto mirati in modo efficiente.
Applicabilità:
L’efficacia del Pattern Flyweight dipende pesantemente da come e dove questo viene utilizzato. Tale pattern è da adottare quando tutte queste condizioni sono valide:
- L’applicazione utilizza un vasto numero di oggetti
- Il costo del mantenimento di tali oggetti è alto a causa del loro vasto numero
- La maggior parte degli stati degli oggetti può essere considerato estrinseco
- Gran parte dei gruppi di oggetti può essere rimpiazzata da oggetti condivisi molto meno numerosi al quale lo stato estrinseco è stato rimosso
- L’applicazione non dipende dall’identità dell’oggetto.
Partecipanti:
- Flyweight → dichiara un’interfaccia attraverso la quale i vari flyweigth possono ricevere ed agire in base allo stato estrinseco
- ConcreteFlyweight → implementa l’interfaccia Flyweight ed aggiunge lo storage dello stato intrinseco se possibile. Un oggetto di tipo ConcreteFlyweight deve essere condivisibile. Qualsiasi stato viene mantenuto deve essere intrinseco, ciò significa che deve essere indipendente dal contesto degli oggetti di tipo ConcreteFlyweight
- UnsharedConcreteFlyweight → non tutte le sottoclassi di tipo Flyweight hanno bisogno di essere condivise. L’interfaccia Flyweight abilita la condivisione ma non la forza. E’ pratica comune per oggetti di tipo UnasharedConcreteFlyweight avere come figli ad un qualche livello della struttura Flyweight oggetti ConcreteFlyweight
- FlyweightFactory → in primis crea e gestisce oggetti di tipo Flyweight, poi assicura che tali oggetti siano condivisi propriamente. Quando un Client richiede un Flyweight, l’oggetto FlyweightFactory sfrutta una istanza già aperta oppure ne crea una nuova
- Client → mantiene un riferimento verso il/i Flyweight ed elabora o immagazzina lo stato estrinseco del Flyweight
Conseguenze:
Innanzitutto Flyweight introduce costi a livello di esecuzione al fine di associare, trasferire, trovare e/o elaborare lo stato estrinseco, in special modo nel caso in cui questo pattern viene utilizzato per mantenere uno stato intrinseco. Tuttavia buona parte del costo è composto da spostamenti nello spazio di salvataggio, che può aumentare nel caso più flyweight siano condivisi. Il mantenimento degli spazi di salvataggio ha delle conseguenze, eccole di seguito:
- la riduzione del numero totale di istanze che provengono dalla condivisione
- il numero di stati intrinseci per oggetto
- dove lo stato estrinseco viene elaborato o mantenuto









