UGIdotNET Home UGIdotNET Home
UGIdotNET Blogs UGIdotNET Blogs
UGIdotNET Forum UGIdotNET Forum
MSDN Architetti MSDN Architetti
Visualizza Modifiche Visualizza Modifiche
Modifica Modifica
Stampa Stampa
Modifiche Recenti Modifiche Recenti
Sottoscrizioni Sottoscrizioni
Ufficio Oggetti Smarriti Ufficio Oggetti Smarriti
Cerca Riferimenti Cerca Riferimenti
Rinomina Rinomina
Cerca

Versioni

06/06/2006 17.10.21
-170.252.72.61
30/12/2005 18.25.46
LucaMinudel-151.47.133.207
30/12/2005 15.06.09
LucaMinudel-151.47.133.207
28/12/2005 16.34.58
LucaMinudel-151.47.133.226
Elenco completo versioni Elenco completo versioni
Pattern Flyweight
.
Summary TBD Un design pattern che separa lo stato variabile di una classe da quello che può essere condiviso tra più oggetti.

Conosciuto anche come

Non ha altri nomi.

Intento

Il 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 .

Motivazione

Quando 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:

  • l'applicazioni usa un grande numero di oggetti che causano una eccessiva occupazione di memoria (RAM)
  • la gran parte di stato dell'oggetto può essere reso intrinseco
  • un elevato numero di oggetti condividono il medesimo stato intrinseco e differiscono soloo per lo stato estrinseco
  • l'applicazione non dipende dall'identità di un oggetto.

Esempi d'uso in .NET

Il 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 .NET

La cache

Gli 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'oggetto

Gli 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à.

Condivisione

La 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 terminazione

La 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 esempio

Del codice .NET di esempio è disponibile qui e anche qui .

Relazione con altri design pattern

Il 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.

Approfondimenti

Il 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

  • Qual'è la condizone minima per usare questo design pattern? Avere migliaia di oggetti, centinaia o decine?

Link

VediAnche CatalogoDeiDesignPattern

UGIdotNETWiki

UGIdotNETWiki è 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

  • PatternFlyweight
© 2008 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali