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

01/01/2006 15.47.47
LucaMinudel-151.47.145.192
01/01/2006 15.47.14
LucaMinudel-151.47.145.192
01/01/2006 15.45.39
LucaMinudel-151.47.145.192
31/12/2005 17.51.11
LucaMinudel-151.47.138.56
31/12/2005 17.50.28
LucaMinudel-151.47.138.56
Elenco completo versioni Elenco completo versioni
Pattern Prototype
.
Summary Un design pattern che istanzia un oggetto clonandolo da un'istanza esistente.

Conosciuto anche come

No ha altri nomi.

Intento

Il design pattern Prototype istanzia un oggetto clonandolo da un'istanza esistente, in questo modo

  • oltre alle classi anche un insieme di istanze possono essere usate come "stampo" per creare nuovi oggetti,
  • si può creare un'istanza senza conoscere il tipo esatto dell'oggetto (vedi PolimorfismoRunTime).

La nuova istanza viene creata a run-time quindi questo design pattern è classificato rispetto allo scopo (vedi ClassificazioneDeiDesignPattern#ClassiOggetti) come rivolto agli oggetti. Rispetto al fine questo design pattern è classificato tra i ClassificazioneDeiDesignPattern#Creazionali.

Diagramma UML

Un'altro diagramma equivalente qui .

Motivazione

In alcuni casi il metodo Clone del Prototype è il metodo più comodo per istanziare degli oggetti:

  • quando c'è una GerarchiaDiClassi composta da molte classi e c'è la necessità di creare il PatternFactoryMethod per ogniuna delle classi, il PatternPrototype è una alternativa conveniente
  • quando la classe da istanziare è nota solo a run-time (è caricata dinamicamente come un plug-in, si sta usando la Reflection in .NET per caricare assembly e classi a run-time), il design pattern Prototype è il modo più semplice e performante per creare nuove istanze (dopo quella iniziale).

In alcuni casi un sistema o una libreria ha bisogno di un certo grado di dinamicità ossia deve essere indipendente da come i suoi oggetti vengono istanziati, inizializzati, composti e organizzati. Il design pattern Prototype permette di creare a run-time un pool di istanze prototipo (ad esempio inizializzate e valorizzate a run-time in base a parametri di configurazione esterni) dalle quali verranno istanziate, inizializzate e composte tutte le altre istanze create dalla libreria e dal sistema.

Esempi d'uso in .NET

In .NET ci sono esempi di applicazione del design pattern Prototype relativamente alla possibilità di creare cloni mentre non ci sono esempi di pool di istanze prototipo usate al posto di classi distinte e mantenute come "stampo" per creare nuove istanze.

L'interfaccia System.IClonable corrisponde all'interfaccia Prototype entrambe con il metodo Clone, le classi .NET che supportano questa interfaccia sono elencate qui: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemicloneableclasstopic.asp

Note sulla implementazione in .NET

L'oggetto System.Object da cui derivano tutti i value-type e reference-type di .NET ha il metodo protetto MemberwiseClone che ogni classe e struttura può utilizzare per implementare il metodo Clone di System.IClonable.

MemberwiseClone effettua una copia bit-per-bit in modo non ricorsivo, eventuali oggetti referenziati dall'oggetto copiato non sono a loro volta copiati ma semplicemente referenziati.

Del codice .NET di esempio è disponibile qui .

Relazione con altri design pattern

Il design pattern Prototype e il PatternAbstractFactory in alcuni casi svolgono la stessa funzione, uno attraverso una RelazioneDiContenimento l'altro attraverso una RelazioneDiEreditarietà. Possono essere usati anche insieme.

Quando c'è un uso esteso del PatternComposite e del PatternDecorator è probabile che possa risultare utile anche il design pattern Prototype.

Il design pattern Prototype spesso è usato insieme al PatternCommand.

Vedi la mappa della RelazioneTraDesignPattern.

Approfondimenti

In altri casi quando alcune classi differiscono solo per alcune proprietà possono essere ricondotte ad un'unica classe (ConcretePrototype1) e le classi distinte possono essere sostituite da prototipi distinti (istanze di ConcretePrototype1) di quella classe (ConcretePrototype1). In questo modo il design pattern Prototype permette di ridurre il numero di classi distinte.

In altri casi ancora istanze di una classe possono essere inizializzate con un numero limitato di combinazioni di stati (i valori di inizializzazione di property e field), in questi casi il design pattern Prototype permette di disporre di un numero limitato di prototipi da clonare in alternativa a dover istanziare le classi manualmente.

La parte più difficile di implementazione di questo design pattern è implementare il metodo Clone, diventa particolarmente difficile gestire i casi di riferimenti circolari.

La parte più difficile di applicazione di questo design pattern è individuare il pool di istanze prototipo.

Domande di approfondimento

  • Quando questo design pattern va preferito rispetto agli altri design pattern creazionali?
  • Qual'è la differenza tra deep copy e shallow copy?

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

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