terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat prototype.md
guest@codeandosimple: ~/blog/design-patterns $ cat prototype.md

Patrón Prototype_

// "El único modo de hacer un gran trabajo es amar lo que haces" - Steve Jobs

# 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

Estructura Prototype

# 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.

Ejemplo Prototype Gráficos

# 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.