Versioni
| Conosciuto anche comeNon ha altri nomi. IntentoIl design pattern Flyweight distingue lo stato di una classe in due parti, una parte di stato che varia raramente detto stato intrinseco e che quindi può essere condiviso tra più oggetti (ConcreteFlyweight) e l'altra parte che varia più frequentemente detto stato estrinseco di cui quindi ogni oggetto si fa carico per se (in questo caso il Client). In questo modo permette di condividere un largo numero di oggetti a grana fine (ConcreteFlyweight) in modo efficiente. Il design pattern Flyweight è uno dei pattern più complessi. La classe ConcreteFlyweight da utilizzare è determinata a run-time quindi questo design pattern è classificato rispetto allo scopo (vedi ClassificazioneDeiDesignPattern#ClassiOggetti) come rivolto alle classi/agli oggetti. Rispetto al fine questo design pattern è classificato tra i ClassificazioneDeiDesignPattern#Comportamentali . Diagramma UML
Un'altro diagramma equivalente qui e qui . MotivazioneQuando il sistema crea un numero elevato di oggetti a grana fine e questi provocano una eccessiva occupazione di memoria (RAM) è possibile intervenire con tecniche di cache che permettono a più utilizzatori di condividere istanze di oggetti che variano raramente, quando questo non è possibile (per esempio perché a basso livello i meccanismi di cache non sono applicabili) o non è sufficiente il Il design pattern Flyweight permette una ulteriore ottimizzazione basata sulla specifica conoscenza semanti dello stato di un oggetto distinguendolo tra intrinseco (che varia raramente ed assume valori comuni a molti oggetti) ed estrinseco (che varia spesso o assume valori distinti per quasi ogni oggetto) e condividendo lo stato intrinseco. Queste sono le condizioni in cui il design pattern Flyweight è efficace:
Esempi d'uso in .NETIl Common Language Runtime ha un "intern pool" in cui vengono inseriti i ConcreteFlyweight delle stringhe che sono riutilizzati da diverse variabili System.String. Quindi il codice System.String pattern = "Flyweight"; System.String design = pattern; mette una copia della stringa "Flyweight" nel "intern pool" e la condivide per le due variabili. Il meccanismo con cui una stringa viene inserita o meno nel "intern pool" è controllata automaticamente dal CLR in base a criteri di ottimizzazione da lui stabiliti, il metodo statico IsInterned permette di verificare se una variabile stringa fa riferimento ad un valore del pool e il metodo statico Intern forza l'inserimento di una stringa nel pool. Note sulla implementazione in .NETLa cacheGli attuali meccanismi di chache di ASP.NET e di ADO.NET sono semplici da usare tendono a sostituire il bisogno di impiegare il design pattern Flyweight applicando la cache alla fonte dati dello stato intrinseco. Il design pattern Flyweight resta utile quando la cache di .NET non è un'opzione o c'è bisogno di una ulteriore ottimizzazione. L'identità dell'oggettoGli oggetti value-type non hanno il concetto di identità ma solo quello di equivalenza (basata sul confronto dello stato interno). In .NET l'identità di un oggetto reference-type si testa con ReferenceEquals mentre è possibile fare l'override di Equals per testare l'equivalenza al posto dell'identità. CondivisioneLa condivisione di istanze di ConcreteFlyweight in applicazioni ASP.NET si ottiene con l'oggetto Application mentre in applicazioni WinForm può avvenire applicando il PatternSingleton. Creazione e terminazioneLa creazione è assolta dal FlayweightFactory. La termnazione dei ConcreteFlyweight condivisi con risorse managed non è un problema perché è gestita automaticamente dal Garbage Collector, mentre nel caso di oggetti con risorse unmanaged va implementata una politica di terminazione. Codice di esempioDel codice .NET di esempio è disponibile qui e anche qui . Relazione con altri design patternIl design pattern Flyweight è usato spesso per implementare il PatternState e il PatternSrategy. Il design pattern Flyweight viene usato anche in combinazione col PatternComposite. Vedi la mappa della RelazioneTraDesignPattern. ApprofondimentiIl design pattern Flyweight può introdurre a run-time un costo di elaborazione dello stato estrinseco che è comunque bilanciato dal risparmio di RAM, inoltre può essere bilanciato dal risparmio di caricamento in memoria dello stato intrinseco dalla fonte dati. Domande di approfondimento
Link
| UGIdotNETWikiUGIdotNETWiki è il WikiWiki italiano dedicato a .NET Se è la prima volta che senti parlare di Wiki, leggi il BenvenutoAiVisitatori e WikiInUnMinuto, oppure il ManualePassoPassoDelWiki. Argomenti Recenti | ||||||||||||||||||||||||||||||||||||
| © 2008 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali | ||||||||||||||||||||||||||||||||||||||