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.
newrequiere 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
recordya implementanwith, 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