L’utilizzo di questo pattern permette la creazione di nuovi oggetti a partire da un oggetto iniziale, detto appunto prototipo. A differenza di altri pattern permette di specificare nuovi oggetti a run time, utilizzando un gestore di prototipi per salvare e reperire dinamicamente le istanze degli oggetti desiderati.
Come per gli altri pattern creazionali, lo scopo dell’applicazione del design pattern Prototype, è principalmente quello di separare il processo di creazione di un oggetto complesso dal flusso applicativo del client.
Il pattern Prototype risulta molto utile nei seguenti casi:
gli oggetti da creare sono noti soltanto a run-time per cui un codice statico non sarebbe utile.
quando desideriamo che le istanze di una classe abbiano un set limitato di stati per cui rimane più conveniente effettuare una clonazione di un prototipo corrispondente piuttosto che costruire manualmente l’oggetto ogni volta.
Le conseguenze dell’applicazione del pattern Prototype sono le seguenti:
Indipendenza dal metodo di creazione: il client utilizza soltanto l’interfaccia fornita dal pattern, disinteressandosi di cosa viene invocato e di come si realizza il processo di creazione.
Modularità a run-time: questa caratteristica consente ai client la possibilità di aggiungere un prodotto a run-time, rendendolo disponibile per la clonazione da parte di altri client. L’utilizzo di questa feature è delegata al prototype manager il quale è in grado di registrare e gestire un nuovo prodotto.
Definizione di nuovi oggetti tramite nuove rappresentazioni: quando si devono definire numerosi oggetti, che si distinguono esclusivamente per i valori che assumono le loro variabili interne, è molto più comodo effettuare una clonazione e impostare la configurazione desiderata piuttosto che costruire gli oggetti manualmente.
Definizione di nuovi oggetti modificandone la struttura: l’utilizzo di prototipi, nelle applicazioni che necessitano di oggetti composti da più parti ne facilitano la creazione e la gestione.
Non proliferazione delle sottoclassi: a differenza di altri pattern, nei quali è necessario creare un factory method e una gerarchia di classi corrispondenti a prodotti diversi, in questo caso occorre soltanto comporre struttura e valori.
L’implementazione di questo pattern prevede tre tipi di problematiche
l’implementazione di un gestore di prototipi, che sia in grado tramite una struttura associativa, di gestire la clonazione dei prototipi esistenti e di permettere l’aggiunta e la memorizzazione di nuovi prototipi.
l’implementazione di una copia profonda degli oggetti, che si occupi di clonare anche gli eventuali oggetti interni.
la predisposizione di un operazione di inizializzazione all’interno dei prototipi, che consenta di inizializzare in modo differente oggetti creati attraverso la clonazione.
Molto interessante.