Prototype Pattern Nedir?
Prototype Pattern, mevcuttaki bir nesne örneğinin kopyalanarak benzer özelliklere sahip yeni nesneler oluşturulması için kullanılan bir tasarım desenidir.
Erdoğancan Yüksel
2 dakika 29 saniye okuma süresi
Prototype Pattern Nedir?
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, 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
Singleton Pattern Nedir?
Singleton Pattern, bir sınıfın yalnızca bir kez oluşturulmasını sağlayarak birden fazla örnek oluşturulmasını engellemek ve ilgili sınıfa global bir erişim noktası sunmak amacıyla yaygın olarak kullanılan bir tasarım desenidir.
1 Ekim 2024
3 dakika 8 saniye okuma süresi
Adapter Pattern Nedir?
Adapter Pattern, uyumsuz arayüzlere sahip iki sınıfın birlikte çalışmasını sağlamak amacıyla kullanılan yapısal (structural) tasarım desenlerinden birisidir. Bir sınıfın arayüzünü (interface) başka bir sınıfın beklediği arayüze dönüştürerek iki sınıf arasında bir köprü kurmaktadır.
5 Ekim 2024
2 dakika 46 saniye okuma süresi
Builder Pattern Nedir?
Builder Pattern, yazılım geliştirme süreçlerinde karmaşık nesnelerin oluşturulması sürecini basitleştirerek bir nesnenin oluşturulmasını ve yapılandırılmasını adım adım yönetmeyi sağlayan ve kodun okunabilirliğini kolaylaştıran tasarım desenidir.
7 Kasım 2024
2 dakika 42 saniye okuma süresi
Factory Method Pattern Nedir?
Factory Pattern, nesne oluşturma sürecinin soyutlayıp bir merkezde toplayarak hangi sınıfın örneğinin oluşturulması gerektiğine karar veren bir sınıf tanımlanması için kullanılan yaratıcı (creational) tasarım desenlerinen birisidir. Özellikle karmaşık nesne yaratma işlemlerinin kontrol edilmesi gereken durumlarda kodun daha esnek ve sürdürülebilir olmasını sağlamaktadır.
11 Ekim 2024
2 dakika 10 saniye okuma süresi