Prototype Pattern – clonarea obiectelor fără a depinde de implementare
În arhitecturile moderne .NET, reutilizarea și flexibilitatea sunt esențiale. Prototype Pattern este unul dintre design pattern-urile creational, folosit pentru a crea noi obiecte prin clonarea unor instanțe existente, fără a depinde de detalii concrete de implementare.
Este ideal atunci când procesul de creare a obiectelor este costisitor sau complex, iar clonarea unei instanțe existente este mai eficientă și mai curată.
🔍 Ce este Prototype Pattern?
Scopul principal al acestui pattern este copierea unui obiect existent (numit prototype) pentru a genera altele noi, păstrând aceleași atribute și comportamente.
În loc să apelăm new și să construim de la zero, creăm o copie configurată deja — o abordare elegantă, mai ales în aplicațiile enterprise .NET cu entități complexe, obiecte configurabile sau modele de date care se repetă.
🧩 Structura generală
Pattern-ul implică:
-
Prototype (interfață) – definește metoda Clone(), folosită pentru a crea o copie a obiectului.
-
ConcretePrototype – implementează metoda Clone() și definește cum se copiază obiectul.
-
Client – folosește metoda Clone() pentru a genera noi instanțe fără a cunoaște clasa exactă.
💻 Exemplu practic în C#
public abstract class DocumentPrototype
{
public string Title { get; set; }
public string Content { get; set; }
public abstract DocumentPrototype Clone();
}
public class Report : DocumentPrototype
{
public string Author { get; set; }
public override DocumentPrototype Clone()
{
return (DocumentPrototype)this.MemberwiseClone();
}
}
// Utilizare
var original = new Report
{
Title = "Raport lunar",
Content = "Analiza vânzărilor",
Author = "Ludo"
};
var copie = (Report)original.Clone();
copie.Author = "Alt autor";
Console.WriteLine($"Original: {original.Author}");
Console.WriteLine($"Copie: {copie.Author}");
📘 În exemplul de mai sus, MemberwiseClone() creează o copie superficială (shallow copy), suficientă pentru obiecte simple.
Pentru structuri mai complexe (ex. liste, obiecte imbricate), se poate implementa un deep copy manual sau folosind serializare.
🧠 Avantaje
✅ Performanță mai bună – evită reconstruirea completă a obiectelor costisitoare.
✅ Flexibilitate – permite crearea de variații ale aceluiași tip fără a modifica clasa de bază.
✅ Izolare de detalii concrete – codul client nu depinde de tipuri specifice.
✅ Simplifică procesul de configurare – poți porni de la un prototip predefinit (ex: setări, template-uri).
⚠️ Dezavantaje
❌ Poate fi complicat pentru obiecte compuse cu referințe multiple (deep copy necesar).
❌ Necesită atenție la referințele mutable – o clonă care partajează date poate cauza efecte nedorite.
❌ Poate fi confuz dacă sistemul are prea multe tipuri de prototipuri.
🏗️ Când folosim Prototype Pattern?
-
Când crearea unui obiect este costisitoare (ex: citirea din fișiere mari, configurări complexe).
-
Când trebuie să creezi multe obiecte similare, dar cu mici variații.
-
Când sistemul trebuie să fie independent de clasele concrete care definesc obiectele.
Exemplu real: într-un sistem de facturare, poți clona un șablon de factură standard și doar modifica datele clientului.
Sau într-o aplicație de design, poți clona o formă grafică și ajusta culoarea sau dimensiunea.
🧩 Prototype în contextul .NET
.NET oferă suport direct prin metoda MemberwiseClone(), dar pentru scenarii mai avansate se pot folosi:
-
Serialization-based cloning (prin System.Text.Json sau BinaryFormatter)
-
Copy constructors pentru control total asupra procesului
-
Record types (în C# 9+) – oferă with expressions pentru copiere imutabilă elegantă
public record Product(string Name, decimal Price);
var original = new Product("Laptop", 5999);
var copie = original with { Price = 5799 };
Acest exemplu arată o variantă modernă și sigură a conceptului de prototip, integrată nativ în limbaj.
🚀 Concluzie
Prototype Pattern este o soluție elegantă pentru situațiile în care vrei să creezi rapid obiecte similare fără să recreezi toată logica de inițializare.
În .NET, el se îmbină natural cu paradigmele moderne (record types, clone methods, object templates) și aduce un plus de performanță și claritate în cod.
🔧 „Nu e nevoie să reinventezi obiectul – clonează-l inteligent!”
