Design Pattern in Java: Prototype

Continuiamo lo studio dei design pattern, analizzando il pattern Prototype, ovviamente facendo riferimento all’implementazione in Java.

 

Prototype è un pattern creazionale, uno dei fondamentali definiti dalla Gangs Of Four.  Se la creazione di un oggetto è costosa in termini di computazione, magari per la quantità di dati con cui tale oggetto deve essere inizializzato, può essere opportuno utilizzare questo pattern che prevede la creazione tramite clonazione di un oggetto già costruito, il prototipo.

In questo modo si risparmia il costo computazionale per popolare eventuali campi.

Design Pattern Prototype

 

 

Il client si rivolge direttamente ad un prototipo, del tipo di cui ha bisogno, per istanziare un nuovo oggetto, invocando il suo metodo clone. Il pattern è molto semplice, nell’implementazione e nel funzionamento. Le uniche vere difficoltà sono nel clonare l’oggetto.

In Java l’implementazione dell’interfaccia Cloneable equivale solo a dichiarare che l’implementazione del metodo clone, ereditato da Object, è valida e legale. La copia semplice però è una copia che si limita a duplicare l’oggetto. Di eventuali oggetti membri viene duplicato il riferimento, non l’oggetto stesso. Spesso quindi, per evitare quello che viene definito aliasing, la mancata indipendenza dei due oggetti, è necessaria una copia profonda (deep clone), che vada a clonare anche tutti i campi membro.

Le liste in Java hanno un’implementazione della copia di questo tipo, come possiamo verificare dalla descrizione del metodo clone di Vector, nelle API:

Returns a clone of this vector. The copy will contain a reference to a clone of the internal data array, not a reference to the original internal data array of this Vector object.

Se si ha necessità di cambiare qualche campo alla copia del prototipo, dato che il metodo clone non accetta parametri, è opportuna la creazione di un metodo che invochi prima il clone poi vada a settare opportunamente tali parametri, che gli sono stati passati:

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *