martes, 21 de abril de 2015

Prototype

Prototype

Propósito: 


El patrón de diseño Prototype (Prototipo), tiene como finalidad crear nuevos objetos duplicándolos, clonando una instancia creada previamente.

Este patrón especifica la clase de objetos a crear mediante la clonación de un prototipo que es una instancia ya creada. La clase de los objetos que servirán de prototipo deberá incluir en su interfaz la manera de solicitar una copia, que será desarrollada luego por las clases concretas de prototipos.

Motivación:

Este patrón resulta útil en escenarios donde es preciso abstraer la lógica que decide qué tipos de objetos utilizará una aplicación, de la lógica que luego usarán esos objetos en su ejecución. Los motivos de esta separación pueden ser variados, por ejemplo, puede ser que la aplicación deba basarse en alguna configuración o parámetro en tiempo de ejecución para decidir el tipo de objetos que se debe crear. En ese caso, la aplicación necesitará crear nuevos objetos a partir de modelos. Estos modelos, o prototipos, son clonados y el nuevo objeto será una copia exacta de los mismos, con el mismo estado. Como decimos, esto resulta interesante para crear, en tiempo de ejecución, copias de objetos concretos inicialmente fijados, o también cuando sólo existe un número pequeño de combinaciones diferentes de estado para las instancias de una clase.


Aplicabilidad:

Usa el patrón Prototype cuando un sistema debería ser independiente de como sus productos son creados, compuestos y representados;
  • Cuando las clases a instancia son especificadas en tiempo de  ejecución, por ejemplo, por carga dinámica, o
  • Para evitar la construcción de una jerarquía de clases de Factories que sean paralelas a la jerarquía de clases de productos, o
  • Cuando las instancias de una clase puedan tener una de solo unas pocas combinaciones diferentes de estado. Esta debería ser más conveniente para instalar un número correspondiente de prototipos y clonarlos en lugar de instanciar la clase manualmente, cada vez con el estado apropiado.
Estructura:


Participantes:
  • Cliente: Es el encargado de solicitar la creación de los nuevos objetos a partir de los prototipos.
  • Prototipo Concreto: Posee características concretas que serán reproducidas para nuevos objetos e implementa una operación para clonarse.
  • Prototipo: Declara una interfaz para clonarse, a la que accede el cliente.
Colaboraciones:


El cliente solicita al prototipo que se clone.

Consecuencias:

Aplicar el patrón prototipo permite ocultar las clases producto (prototipos concretos) del cliente y permite que el cliente trabaje con estas clases dependientes de la aplicación sin cambios.

Además, hace posible añadir y eliminar productos en tiempo de ejecución al invocar a la operación clonar, lo que supone un método que proporciona una configuración dinámica de la aplicación.

Este patrón permite la especificación de nuevos objetos generando un objeto con valores por defecto sobre el que posteriormente se podrán aplicar cambios. La especificación de nuevos objetos también puede realizarse mediante la variación de su estructura. Reducción del número de subclases.

Implementación:

El patrón utiliza clases abstractas, como veremos a continuación y únicamente tres tipos de clases que hacen su aplicación bastante fácil.

Código de ejemplo:

public interface Prototype {
        public abstract Object clone ( );
}



public class ConcretePrototype implements Prototype {
        public Object clone() {
               return super.clone();
        }
}

public class Client {

        public static void main( String arg[] )
        {
               ConcretePrototype obj1= new ConcretePrototype ();
               ConcretePrototype obj2 = ConcretePrototype)obj1.clone();
        }

}

Usos conocidos:

Se utiliza cuando el tipo de objetos para crear se determina por un prototipo de ejemplo, que se clona para producir nuevos objetos. Este patrón se utiliza para:
  • Evitar las subclases de un creador de objetos en la aplicación cliente, como el patrón de la fábrica abstracta hace.
  • Evitar el costo inherente a la creación de un nuevo objeto en la forma estándar (por ejemplo, el uso de la ' nueva 'palabra clave) cuando es prohibitivamente caro para una aplicación determinada.

1 comentario:

  1. Muchas gracias por tu aporte, esta muy completo y muy claro.

    Saludos

    Atten:

    Juan Carlos Florez
    Estudiante Ing Software

    ResponderEliminar