# Propósito
El Prototype permite la creación de nuevos objetos clonando un objeto existente, conocido como el prototipo, evitando la necesidad de conocer los detalles de cómo se crean estos objetos.
Tenemos un objeto con algunos estados posibles, creamos prototipos de cada uno y los clonamos, evitando tener que pasar muchos parámetros o saber qué valores van en cada uno.
# Problema
La necesidad de duplicar objetos existentes, con comportamiento o estado similar, o cuando la creación directa es costosa (en términos de recursos o tiempo).
# Solución
-
Clonación de objetos: En lugar de crear un objeto desde cero, se clona uno existente que sirve como prototipo.
-
Interfaz común de clonación: Esto permite que los objetos se clonen sin acoplar el código al tipo concreto del objeto.
# Estructura
# Participantes
- Prototype: Interfaz para clonarse.
- ConcretePrototype: Implementa una operación para clonarse.
- Client: Crea un nuevo objeto pidiéndole al prototipo que se clone.
# Cuándo Usarlo
-
Las clases a instanciar se especifican en tiempo de ejecución.
-
Las instancias de una clase puedan tener uno de entre unos pocos estados.
-
Costos de creación altos frente a clonar.
-
Se requieren objetos similares.
# Ventajas
-
verified
Eficiencia: Clonar es más eficiente que crear desde cero.
-
verified
Ocultamiento: El cliente ignora la complejidad de construcción.
-
verified
Flexibilidad: Agregar/eliminar objetos en tiempo de ejecución.
# Desventajas
-
warning
Clonaciones complejas: Problemas con referencias circulares o clonación profunda.
-
warning
Operación clone: Requiere implementarla en todas las subclases.
# Ejemplo: Sistema de gráficos
Desarrollamos un sistema y necesitamos crear múltiples instancias de formas geométricas configurables (círculos o rectángulos).
Problema
Crear formas de manera eficiente sin saber cómo se construyen, considerando que pueden ser costosas de replicar.
Solución planteada
Implementamos un Prototype para clonar objetos existentes. Creamos la interfaz Shape, y las clases Circle y Rectangle que saben cómo clonarse.
# Código Java
interface Shape {
Shape clone();
}
class Circle implements Shape {
private int radius;
public Circle(int radius) { this.radius = radius; }
@Override
public Circle clone() { return new Circle(this.radius); }
}
class Rectangle implements Shape {
private int width, height;
public Rectangle(int w, int h) { this.width = w; this.height = h; }
@Override
public Rectangle clone() { return new Rectangle(this.width, this.height); }
}
class GraphicTool {
private Shape shape;
public GraphicTool(Shape shape) { this.shape = shape; }
public Shape createShape() { return shape.clone(); }
}
# Conclusiones
El uso de un Prototype permite crear instancias de objetos complejos eficientemente, evitando la costosa creación desde cero cada vez.
# Patrones relacionados
Factory Method
Suele usarse con Prototype para crear objetos.
Abstract Factory
Una fábrica puede almacenar prototipos para clonar productos.
Composite y Decorator
Diseños con estos patrones se benefician enormemente del Prototype.