22.08.2017

Prototip Tasarim Deseni

Bu yazimda "Creational" desenler grubunda yer alan "Prototype" tasarim deseninden ve bu deseni C# ile nasil gerçeklestirebilecegimizden bahsedecegim.

Bu yaziyi okumadan önce tasarim desenleri hakkinda ayrintili bilgi edinmek ve "Creational" grubundaki diger desenleri incelemek için asagidaki baglantilari kullanabilirsiniz.

  • Singleton Tasarim Deseni
  • Abstract Factory Tasarim Deseni
  • Builder Tasarim Deseni


"Prototype" deseni yukarida adi geçen diger tasarim desenlerine nazaran daha kolay alginmaktadir. Ancak "Prototype" deseni gerçek projelerde digerlerine nazaran daha az siklikta kullanilmaktadir. Bazi spesifik projelerde çok kullanilmakta ve oldukça da faydali bir kaliptir. "Prototype" deseni adindan da anlasilacagi üzere sonradan olusturulacak nesneler için prototip görevi üstelenen bir yapiyi olusturmak için kullanilir. Bir yazilim gelistirici olarak projelerimin bir çok noktasinda kullandigim belirli nesnelerin o an için bir kopyasini olusturmak ve o noktadan sonra yapacagim isleri artik bu kopya nesne üzerinden yapma istegim olmustur. Bu istegimi nesne yönelimli programlama tekniklerini kullanarak bir sekilde gerçeklestirebiliyorum. Böylece hem belirli bir noktadan sonra orjinal nesnemin durumunu korumasini garanti altina almis oluyorum hem de varolan bir nesneyi kopyalarak yeni bir nesne yaratma zahmetine girmemis oluyorum. Eger bu kopya nesnelere sik sik ihtiyaç duyarsam bu sefer de kopyalama isleminin hem verimli çalismasini garanti etmem gerekli hemde kopyalama islemini tek bir merkezden idare etmem gerekli. Iste bu durumda imdadimiza "Prototype" tasarim deseni yetismekte. Bu desen varolan bir nesnenin kopyalanarak yeni bir nesneye aktarilmasini kolaylastiran bir yapi sunmakta. Özetle, bu desen varolan nesnelerin kopyalanmasi yolu ile yeni nesnelerin üretilmesi için gerekli olan kalibi sunmaktadir. Bu yapiyi asagida örneklendirecegim ancak öncelikle nesne kopyalama çesitleri üzerinde durmak gerekir. 

Nesnelerin kopyalanmasi 2 sekilde olabilmektedir. Birinci yöntem "shallow copy" denilen ve sadece nesnelerin referanslarinin kopyalandigi klasik atama islemlerinde meydana gelen kopyalama biçimidir. Bu tür bir kopyalamada yalnizca nesnenin bellekteki adresi kopyalanmaktadir. Dolayisiyla bu yöntem burada bahsedilen "Prototype" desenine pek uygun degildir. Ikinci yöntem ise "Deep Copy - Derin Kopyalama -" denilen yöntemdir ki bu yöntemde nesneler birebir kopyalanarak yeni referans degiskenine atanir. C#’ta deger türlerinin birbirlerine atanmasi bu tür bir kopyalama islemine örnek olarak verilebilir. Fakat "Prototype" deseninde söz konusu olan referans türden nesnelerin "deep copy" yöntemi ile kopyalanmasidir. 

.NET Framework içerisindeki IColoneable arayüzünde bulunan Clone() metodu genellikle "shallow copy" yapmak için kullanilir. IClonable arayüzünü uygulayan sinif nesneleri ile Clone() metodu kullanildiginda geriye dönen deger bellekteki varolan nesneyi isaret eden referanstan baska birsey degildir. Ancak clone metodu deger tipleri için kullanildiginda siniflar için birinci seviyeden "Deep Copy" olarak ta kullanilabilmektedir. "Deep Copy" islemi için .NET’te genellikle Serialization API’si kullanilmaktadir. Bir nesnenin yeni bir kopyasini elde etmek için nesnenin durumu seilestirilerek bir dosyaya kaydedilir ve dosyadan okunan serilestirilmis bilgiler yeni bir nesneye aktarilir. Bu yazidaki "Prototype" deseni uygulamasinda nesnelerin kopyasinin çikarilmasi asamasini Object sinifini protected üye metodu olan MemberWiseClone() metodunu kullanacagiz.

"Prototype" deseninde üç temel yapi bulunmaktadir. Bu yazpilar asagidaki gibi listelenmistir.

  •  Soyut Prototip :Kopyalanarak yeni nesnelerin olusturulacagi siniflar için temel teskil eden ve çogunlukla içinde kopyalama islemini görecek özet bir metodun bulundugu abstract siniftir yada içinde sadece bildirimlerin yer aldigi bir arayüzdür. Ihtiyaca göre bu yapi özet(abstract) bir sinif olabilecegi gibi bir arayüzde olabilir.
     
  •  Somut Prototip Nesneleri :Soyut nesneleri uygulayan ve projelerde kullanilan gerçek nesneleri temsil ederler. Kopyalama islemi soyut siniftan kalitilan bir metot ile yapilir.
     
  •  Istemci(Client) Uygulama :Somut prototip nesnelerinden birer kopyasini elde edecek metot, sinif yada baska bir üye elemandir.

Not : Görüldügü üzere, "Prototype" deseni daha önce anlatmis oldugum desenlere nazaran çok kolay ve anlasilirdir. Bu kolayligin en büyük nedenlerinden biriside nesnelerin kopyalanmasi için .NET Framework’un saglamis oldugu imkanlardir.