patron prototype cristina merino héctor carbajo alicia arroyo
TRANSCRIPT
PATRON PROTOTYPE
Cristina Merino
Héctor Carbajo
Alicia Arroyo
ÍNDICE
• Propósito• Aplicabilidad• Reglas• Estructura• Participantes• Beneficios• Implementación• Ejemplo
PROPÓSITO
• Es un patrón de creación.
• El objetivo de este patrón es especificar los tipos de objetos a crear por medio de una instancia que hace de prototipo, creando nuevos objetos copiando dicha instancia.
• Todo se basa en clonar un prototipo dado.
APLICABILIDAD
• Se debe usar este patrón cuando un sistema deba ser independiente de cómo se crean, se componen y se representan sus productos, y además:– Cuando las clases a instanciar sean especificadas
en tiempo de ejecución.– Para evitar construir una jerarquía de clases de
fábricas paralela a la jerarquía de clases de producto.
– Cuando las instancias de una clase puedan tener uno de entre sólo unos pocos estados diferentes.
REGLAS
• Algunas de las reglas que se cumplen en este patrón son:– Si un objeto tiene distinto comportamiento según su
estado …– Si una jerarquía de clases tiene muchos niveles …– Si algo se utiliza poco ó no se utiliza …– Si una superclase conoce a alguna de sus subclases …– Si una clase colabora con muchas …– Si un cambio en una interfaz impacta en muchos
clientes …– etc
ESTRUCTURA
PARTICIPANTES
• Prototipo– Declara una interfaz para clonarse
• Prototipo Concreto– Implementa una operación para clonarse
• Cliente– Crea un nuevo objeto pidiéndole a un
prototipo que se clone
BENEFICIOS
• Algunos beneficios de aplicar este patrón son:– Añadir y eliminar productos en tiempo de
ejecución.– Especificar nuevos objetos modificando valores.– Especificar nuevos objetos variando la estructura.– Reducir la herencia.– Configurar dinámicamente una aplicación con
clases
IMPLEMENTACIÓN
• A la hora de implementar prototipos hay que tener en cuenta los siguientes aspectos:
– Usar un gestor de prototipos (Cuando el número de prototipos no es fijo)
– Implementar la operación clonar
– Inicializar los clones (Personalizarlos)
Código en lenguaje Java
EJEMPLO
• Un grupo de científicos ha construido una maquina para clonar, programada de Java.
• El primer experimento consiste en clonar todo el número de ovejas que puedan.
• Más tarde ampliaron la funcionalidad de la máquina para permitir la clonación de vacas.
INTRODUCCIÓN
PROBLEMAS
• La máquina cuenta con varios problemas:
– El método de clonación, devuelve un objeto no una vaca u oveja.
– El método no sabe lo que crear a priori.– Si queremos clonar otro tipo de animal
necesitaremos “arreglar” la máquina.– Máquina difícil de mantener.
SOLUCIÓN
• Dar información a la máquina a priori y pedirle a la misma que le devuelva un número de copias del mismo
• Despreocuparse del funcionamiento de la máquina.
• Añadir funcionalidades especiales a la forma de clonar los animales para tratarlos de una forma u otra.
SOLUCIÓN: Fase 1
• La primera tarea será crear un interfaz ( que extiende Cloneable, implementando de este modo el método clone( ) ), que será el que implementen tanto la Vaca como la Oveja
SOLUCIÓN: Fase 1
• public interface CloneableAnimal extends Cloneable
{
public CloneableAnimal duplicate( );
}
Ese método duplicate( ) será el encargado de crear y devolver una nueva copia de cada animal que lo implemente.
SOLUCIÓN: Fase 2
• La oveja será: • public class Sheep implements CloneableAnimal
{
public Sheep( )
{
System.out.println("Creada la plantilla de la oveja");
}
public CloneableAnimal duplicate( )
{
System.out.println( "La oveja se va a clonar a sí misma" );
Sheep returnValue = null;
SOLUCIÓN: Fase 2• try
{
returnValue = ( Sheep ) super.clone( );
}
catch( Exception e )
{
System.out.println( "error cloning Sheep" );
}
return returnValue;
}
public String toString( )
{ return "Soy una oveja clonada, beeeeee"; } }
SOLUCIÓN: Fase 2
• Aquí esta la vaca: public class Cow implements CloneableAnimal
{ public Cow( ) {
System.out.println( "Creada la plantilla de la vaca" ); }public CloneableAnimal duplicate( ) {
System.out.println( "creando una nueva instancia de Cow" );
return new Cow( ); } public String toString( ) {
return "Muuuu, soy un clon de vaca" ; }
}
SOLUCIÓN: Fase 3
• Ahora, los investigadores tan sólo tendrán que hacer algo así:
• public class Professor
{
public static void sayIt( String words )
{
System.out.println( "" ); System.out.println( words ); System.out.println( "" );
}
SOLUCIÓN: Fase 3
• public static void main( String[] args )
{
CloningMachine cMachine = new CloningMachine( );
sayIt( "creating Sheep and Cow templates" );
Sheep sheepTemplate = new Sheep( );
Cow cowTemplate = new Cow( );
Cow clonedCow = ( Cow )cMachine.newClone( cowTemplate );
sayIt( "primera vaca clonada" );
SOLUCIÓN: Fase 3
• Sheep clonedSheep = ( Sheep ) cMachine.newClone( sheepTemplate );
sayIt( "first cloned sheep" );
System.out.println( clonedSheep );
sayIt( "Creando 10 vacas nuevas" );
CloneableAnimal[] newCows =cMachine.cloneMany(10, cowTemplate);
sayIt( "Creando 10 ovejas nuevas" );
CloneableAnimal[] newSheeps = cMachine.cloneMany(10,sheepTemplate );
SOLUCIÓN: Fase 3
• sayIt( "Probando las vacas" );
for( int i=0; i< newCows.length; i++ )
{
System.out.println( newCows[ i ] );
}
sayIt( "Probando las ovejas" );
for( int i=0; i< newSheeps.length; i++ )
{
System.out.println( newSheeps[ i ] );
}
}
SOLUCIÓN: Fase 4
• La clase CloningMachine es:
public class CloningMachine{
public CloningMachine( ){
}
public Clonable createCopy( IClonable template ){
return template.getCopy( );}
SOLUCIÓN: Fase 4• public Clonable[]createManyCopies(int numCopies,Iclonable template)
{
Clonable[] returnArray = new Clonable[ numCopies ];
for( int i=0; i< numCopies; i++ ){
returnArray[ i ] = template.getCopy( );}
return returnArray;}
Conclusiones
• La máquina crea objetos sin saber de qué tipo deben ser.
• Se ha separado el código que crea los objetos, del código que maneja los detalles de la creación de nuevos objetos, permitiendo añadir nuevas características a los animales clonados.
PATRONES RELACIONADOS
• El patrón Abstract Factory es un rival en algún aspecto, y también pueden usarse juntos.
• Los diseños que hacen un uso intensivo de los patrones Composite y Decorator suelen beneficiarse también de este patrón.