Creational Design Patterns (Yaratımsal Tasarım Kalıpları) ailesine ait ProtoType Design Pattern aynı nesneden birden fazla kez ihtiyaç olması durumda her nesne için tekrar tekrar new diyerek türetilmesi yerine ilk oluşturulan nesnenin kopyalanarak çoğaltılmasına olanak sağlayan tasarım desenidir.
Aslında ProtoType Design Pattern‘i biz günlük hayatımızda da çok kullanıyoruz. Örneğin iş yerinde yaptığınız işleri raporladığınız bir word ya da excel dosyası olduğunu düşünün. Bu dosyanın belirli bir formatı vardır ve bu formatta ki sadece bazı alanlar değiştirilerek her gün yeni bir rapor hazırlanır. Her seferinde dosyayı sıfırdan oluşturup çalışmak mı daha kolay yoksa varolan dosya üzerinde kopyala yapıştır yaparak değişiklik yapmak mı daha kolaydır. Tabiki kopyalamak çok daha kolaytır.
Sistemimizin de performanslı çalışması için mümkün olduğunda tembel insanlar gibi düşünmemiz gerekiyor. Tembel derken sisteme daha az iş yaptırarak performansı olumsuz etkilemeyen ve aynı sonuca varacak fikirlerden bahsediyorum 🙂
ProtoType Design Pattern‘i bir örnekle incelemeye çalışalım. Varsayalım ki bir şirket günlük satış tutarları üzerinden önemli kararlar aldığı için günde 3 kez toplantı yapmaya karar verdi. Bu toplantıları da kayıt ettikleri bir yazılımları olsun. Toplantıyla ilgili başlangıç, bitiş tarihi, konum, katılımcılar, araç gereçler ve şirketin durumunun özetlendiği bir alan olduğunu varsayalım. Bu özet alanının da biraz maliyetli olduğunu varsayalım. Toplantılar sisteme günlük job ile otomatik olarak atansın. Bu durumda ProtoType Design Pattern’i kullanmazsak aynı toplantının sadece tarih alanları farklı olduğu halde 3 kere new diyerek toplantı üretip kaydetmemiz gerekecekti. Üstelik bu sınıfı üretmek bizim için biraz maliyetliydi. Ama biz bir kere toplantı eklesek ve diğer ikisini de bu toplantı üzerinden eklersek ciddi bir kazanım elde etmiş oluruz. Bu örnekte benzer kayıt 2 tane olarak varsaydık ama bunun yüzlerce olduğu örneklerde olabilir.
Gelelim kod olarak örneğimize
İlk olarak Meeting adında bir sınıf oluşturuyorum. Bu sınıfın içinde nesneyi koplayacak Clone adında metot oluşturuyorum. Bu metot miras alınan sınıflar tarafından oluşturulacağı için abstract olarak tanımlıyorum. Abstract metot olduğu için sınıfımı da abstract olarak tanımlıyorum.
1 2 3 4 5 6 7 8 9 10 11 12 |
abstract class Meeting { public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public string Location { get; set; } public List<string> Participants { get; set; } public List<string> Materials { get; set; } public object OrderSummary { get; set; } public abstract Meeting Clone(); } |
Meeting sınıfından türetilmiş DailyMeeting sınıfımı oluşturuyorum. Meeting sınıfından gelen Clone metodu abstract olduğu için override edip içini dolduruyorum. this.MemberwiseClone() metodu .net frameworküne ait bir sınıftır. Belirtilen sınıfın kopyasını oluşturur.
1 2 3 4 5 6 7 |
class DailyMeeting : Meeting { public override Meeting Clone() { return (Meeting)this.MemberwiseClone(); } } |
Main metodumda da bir toplantı oluşturup aynı toplantı üzerinden başlangıç ve bitiş zaman aralıklarını değiştiriyorum.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
static void Main(string[] args) { var dailyMeetingMorning = new DailyMeeting() { StartDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 08:00")), EndDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 08:15")), Location = "Versatil", Materials = new List<string> { "Projeksiyon Cihazı", "Laptop", "Sticker" }, Participants = new List<string> { "Samet", "Bayram","Enes" }, OrderSummary = "Bu kısmın uzun hesaplamalar sonucunda oluştuğunu varsayalım" }; var dailyMeetingNight = dailyMeetingMorning.Clone(); var dailyMeetingNoon = dailyMeetingMorning.Clone(); dailyMeetingNight.StartDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 16:00")); dailyMeetingNight.EndDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 16:15")); dailyMeetingNoon.StartDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 12:00")); dailyMeetingNoon.EndDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 12:15")); Console.WriteLine(string.Format("DailyMeetingMorning: {0} - {1}", dailyMeetingMorning.StartDate, dailyMeetingMorning.EndDate)); Console.WriteLine(string.Format("DailyMeetingNoon: {0} - {1}", dailyMeetingNoon.StartDate, dailyMeetingNoon.EndDate)); Console.WriteLine(string.Format("DailyMeetingNight: {0} - {1}", dailyMeetingNight.StartDate, dailyMeetingNight.EndDate)); Console.ReadLine(); } |
Sabah, öğlen ve akşam olmak üzere 3 toplantı oluşturdum. öğlen ve akşam için oluşturduğum toplantılar sabah için oluşturduğum nesne üzerinden kopyalayarak oluşturdum. Ekran çıktılarına baktığınızda birbirinden koplayanmasına rağmen farklı nesneler olduğunu göreceksiniz.

Özet olarak ProtoType Design Pattern tekrar eden nesneleri yeniden oluşturmadan kopyalayarak işlem yapmamıza olan sağlayan tasarım desenidir.
Bir önceki yazımda Singleton Design Pattern‘i incelemiştik dilerseniz onu da okuyabilirsiniz.
Hoşçakalın.