Prototype

Crea nuevos objetos clonando una instancia existente, evitando depender de sus clases concretas.

Contexto

Necesitas duplicar objetos cuya configuración es costosa de reproducir o cuya construcción depende de estado privado al que no tienes acceso.

Problema
  • Copiar campo a campo desde fuera viola la encapsulación.
  • new requiere conocer la clase concreta y replicar todos los pasos.
Solución

Cada objeto sabe clonarse a sí mismo (Clone()), devolviendo una copia independiente.

#Ejemplo en C#

public abstract record Shape
{
    public int X { get; init; }
    public int Y { get; init; }
    public string Color { get; init; } = "black";

    public abstract Shape Clone();
}

public sealed record Circle(int X, int Y, string Color, int Radius) : Shape
{
    public override Shape Clone() => this with { };  // copia superficial gratis
}

En C# moderno, los record ya implementan with, que es Prototype semánticamente.

Cuándo NO aplicarlo
  • Cuando el objeto contiene referencias profundas que requieren clonación recursiva no trivial.
  • Cuando puedes simplemente serializar/deserializar.
Tradeoffs
Pro Contra
Independencia de clases concretas Clonación profunda es difícil de mantener
Velocidad cuando construir cuesta Riesgo de aliasing si la copia es superficial

#creational #gof #clone