lunes, 13 de junio de 2011

Patrón de diseño: Prototype


Estuve estudiando este patrón de diseño para enseñarlo en una clase. Este patrón en resumen permite crear nuevos objetos al hacer una copia exacta de un objeto prototípico.

El principal uso que le encuentro al patrón, al menos de primera impresión ya que los patrones se van digiriendo con el tiempo, es el ahorro que se logra en casos donde la instanciación de un objeto es costoso en términos de recursos del sistema (memoria, tiempo, procesamiento, etc).

En el ejemplo de abajo simulo esta aplicación. La clase Sheep (oveja) cuando se instancia require la construcción de su cadena de ADN; este es el supuesto proceso pesado. Java ya incluye una interface llamada "Cloneable" que cuando se implementa en una clase, las instancias de la clase se pueden clonar. Cuando hablamos de clonar nos referimos a crear una copia exacta de un objeto al dejar los mismos valores de sus atributos de clases en una instancia aparte.

La clase Sheep implementa por tanto esta interface con lo cual crear otra oveja similar es asunto simplemente de llamar el método "clone()".

public class Sheep implements Cloneable {

protected String dna;
protected final char [] DNA_ALPHABET = {'A','C','T','G'};

public String getDNA() {
return dna;
}

public Sheep() {
// Simulates extremely long process to create a sheep.
StringBuilder dnaBuilder = new StringBuilder();

for(int i=0; i < 30; i++) {
int alphabetIndex = (int) (Math.random() * 10 % 4);
dnaBuilder.append(DNA_ALPHABET[alphabetIndex]);
}
dna = dnaBuilder.toString();
}

@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}

public static void main(String[] args) {
Sheep dolly = new Sheep();
System.out.println("Dolly was born: " + dolly.getDNA());

try {
Sheep dollyClon = (Sheep) dolly.clone();
System.out.println("Dolly Clon: " + dollyClon.getDNA());

} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}

Resultado:

Dolly was born: CAAACGGGACACTTATACTTGTTCGCCCAT
Dolly Clon: CAAACGGGACACTTATACTTGTTCGCCCAT

No hay comentarios:

Publicar un comentario