Prototype Pattern Nedir?

Can Yüksel

Erdoğancan Yüksel

2 dakika 29 saniye okuma süresi

Prototype Pattern, mevcuttaki bir nesne örneğinin kopyalanarak benzer özelliklere sahip yeni nesneler oluşturulması için kullanılan bir tasarım desenidir.

prototype-pattern-nedir

Prototype pattern, yaratıcı (creational) tasarım desenlerinden birisidir. Mevcut bir nesnenin kopyasını oluşturarak yeni nesneler yaratmayı sağlamaktadır. Bu şekilde nesne oluşturma işlemlerinin karmaşıklığından kaçınma imkanı sunmaktadır. Yeni bir nesne oluştururken birçok karmaşık adım gerekiyorsa bunun yerine mevcut nesnenin kopyalanması daha verimli olmaktadır.

Prototype pattern'ın kullanım amaçları şu şekilde sıralanabilir:

  • Yeni nesne oluşturma sürecinindeki karışıklığı ve maliyeti azaltarak işlem kolaylığı sağlamaktadır.
  • Karmaşık bir nesne yapısını tekrar tekrar birçok basamakta oluşturmak yerine kopyasını oluşturarak yeni nesne oluşturulması sağlanmaktadır.

C# ile Prototype Pattern Uygulaması

Prototype Pattern uygulaması için kod örneği:

// Clone metodunu içeren arayüz
public interface IClonable<T>
{
    // Yüzeysel Kopyalama metodu
    T ShallowCopy();

    // Derin Kopyalama metodu
    T DeepCopy();
}

// Somut Document sınıfı
public class Document : IClonable<Document>
{
    public required DocumentIdInfo DocumentIdInfo { get; set; }
    public string? Title { get; set; }
    public string? Content { get; set; }
    public DateTime CreationTime { get; set; }
    public int CreatorId { get; set; }

    // Nesne üzerinde işlem yapmadan doğrudan kopyalar. (Yüzeysel kopyalama)
    public Document ShallowCopy()
    {
        return (Document)this.MemberwiseClone();
    }

    // Nesnenin referans türlenin de kopyalanıp üzerinde işlem yapılmasıdır. (Derin kopyalama)
    public Document DeepCopy()
    {
        Document clone = (Document)this.ShallowCopy();
        clone.DocumentIdInfo = new DocumentIdInfo(DocumentIdInfo.Id);
        clone.Title = new string("Copy of " + this.Title);
        return clone;
    }
}

public class DocumentIdInfo
{
    public Guid Id { get; set; }

    public DocumentIdInfo(Guid id)
    {
        this.Id = id;
    }
}

// Kullanım
Document document = new Document
{
    DocumentIdInfo = new DocumentIdInfo(Guid.NewGuid()),
    Title = "Original Document Title",
    Content = "This is the content of the original document",
    CreationTime = DateTime.UtcNow,
    CreatorId = 1
};

Document shallowCopiedDocument = document.ShallowCopy();
Document deepCopiedDocument = document.DeepCopy();

Console.WriteLine($"Original document:\n Id:{document.DocumentIdInfo.Id}\n Title:{document.Title}\n Content:{document.Content}\n Creation Time:{document.CreationTime}\n CreatorId:{document.CreatorId}");
Console.WriteLine($"Shallow Copied document:\n Id:{shallowCopiedDocument.DocumentIdInfo.Id}\n Title:{shallowCopiedDocument.Title}\n Content:{shallowCopiedDocument.Content}\n Creation Time:{shallowCopiedDocument.CreationTime}\n CreatorId:{shallowCopiedDocument.CreatorId}");
Console.WriteLine($"Deep Copied document:\n Id:{deepCopiedDocument.DocumentIdInfo.Id}\n Title:{deepCopiedDocument.Title}\n Content:{deepCopiedDocument.Content}\n Creation Time:{deepCopiedDocument.CreationTime}\n CreatorId:{deepCopiedDocument.CreatorId}");


// MemberwiseClone() metodu ile DeepCopy metodu arasındaki fark

// Deep copy işleminde referans türleri de kopyalanır.
document.DocumentIdInfo.Id = Guid.NewGuid();

Console.WriteLine("\nAfter original document modified \n");
Console.WriteLine($"Original document:\n Id:{document.DocumentIdInfo.Id}\n Title:{document.Title}\n Content:{document.Content}\n Creation Time:{document.CreationTime}\n CreatorId:{document.CreatorId}");
Console.WriteLine($"Shallow Copied document:\n Id:{shallowCopiedDocument.DocumentIdInfo.Id}\n Title:{shallowCopiedDocument.Title}\n Content:{shallowCopiedDocument.Content}\n Creation Time:{shallowCopiedDocument.CreationTime}\n CreatorId:{shallowCopiedDocument.CreatorId}");
Console.WriteLine($"Deep Copied document:\n Id:{deepCopiedDocument.DocumentIdInfo.Id}\n Title:{deepCopiedDocument.Title}\n Content:{deepCopiedDocument.Content}\n Creation Time:{deepCopiedDocument.CreationTime}\n CreatorId:{deepCopiedDocument.CreatorId}");


//# Output:
Original document:
 Id:a5e1321b-0303-408e-9f75-69e8d986b2bf
 Title:Original Document Title
 Content:This is the content of the original document
 Creation Time:13.11.2024 19:22:05
 CreatorId:1
Shallow Copied document:
 Id:a5e1321b-0303-408e-9f75-69e8d986b2bf
 Title:Original Document Title
 Content:This is the content of the original document
 Creation Time:13.11.2024 19:22:05
 CreatorId:1
Deep Copied document:
 Id:a5e1321b-0303-408e-9f75-69e8d986b2bf
 Title:Copy of Original Document Title
 Content:This is the content of the original document
 Creation Time:13.11.2024 19:22:05
 CreatorId:1

After original document modified

Original document:
 Id:7b67eb83-430d-4b21-98ad-0d63d1bee7cb
 Title:Original Document Title
 Content:This is the content of the original document
 Creation Time:13.11.2024 19:22:05
 CreatorId:1
Shallow Copied document:
 Id:7b67eb83-430d-4b21-98ad-0d63d1bee7cb
 Title:Original Document Title
 Content:This is the content of the original document
 Creation Time:13.11.2024 19:22:05
 CreatorId:1
Deep Copied document:
 Id:a5e1321b-0303-408e-9f75-69e8d986b2bf
 Title:Copy of Original Document Title
 Content:This is the content of the original document
 Creation Time:13.11.2024 19:22:05
 CreatorId:1

Yukarıdaki kod bloğunda:

  • IClonable: ShallowCopy() ve DeepCopy() metotları aracılığı ile nesne kopyalama işlevlerini tanımlayan arayüzdür.
  • Document: IClonable arayüzünü uygulayarak oluşturulan prototype sınıfıdır.
  • MemberwiseClone() Metodu: Yüzeysel kopyalama işlemini gerçekleştirmektedir. Bu yöntem kullanıldığı sınıfın nesne örneğinden bir kopya daha oluşturmaktadır. Ancak nesnenin referans türündeki alt özelliklerinin kopyasını oluştmaz. Bu nedenle orjinal öğenin referans türündeki değişiklik yalnızca ShallowCopy() metodunda yansımıştır. DeepCopy() metodunda orjinal nesnenin içindeki referans türleri de kopyalanarak bağımsız bir nesne oluşturulmuştur.

 Sonuç olarak Prototype Pattern nesne oluşturma işlemlerinde kod tekrarı olmadan nesneleri kopyalamak ve nesne oluşturma maliyetlerini azaltmak için oldukça kullanışlı bir tasarım desenidir. Karmaşık nesnelerin kopyalanması gereken durumlarda ilgili tasarım desenini uygulamak oldukça faydalıdır.

Benzer İçerikler