TASARIM DESENLERİ YAZI DİZİSİ 4-Prototype (Prototip)

Creational Patterns (Yaratıcı Tasarım Desenleri) grubu altında yeralan Prototype tasarım deseni üretilmek istenen bir nesnenin var olan farklı bir nesneden kopyalanması ile üretilmesini sağlamaktadır.

Peki neden böyle birşeye ihtiyacımız var?

Bazı nesnelerin new operatörü ile oluşturulmasının maliyetli (bellek alanı, oluşturulma süreci vs..) olduğu durumlar söz konusu olabilir. İşte bu gibi durumlarda var olan bir nesnenin kopyasının alınması her zaman daha az maliyetli olacak ve bizlere zaman + performans kazandıracaktır.

Bu durumu şu şekildeki bir senaryo ile daha kolay kavrayabiliriz.

Var olan bir web sitemizde bulunan üyelerimize ait ad, soyad ve üyelik tipini tanımlayabileceğimiz ve bu bilgileri bir listede tutarak ekrana yazdırabileceğimiz bir senaryomuzun olduğunu düşünelim.

Bu durumda tüm üyelerimize ait oluşturulacak nesnenin yapısal özellikleri aynı sadece içerikleri farklı olacaktır. Bu da aynı nesneden sürekli yeni oluşturmamız yerine var olan bir nesneyi MemberwiseClone metodu ile kopyalayarak sadece içeriklerini değiştirmemizle işimizi çözebilmemizi sağlayacaktır.

Şimdi belirtmiş olduğumuz bu yapımızı Prototype Tasarım Deseni ile tasarlayalım.

İlk yapmamız gereken Uyelerimizi tanımlayabileceğimiz Clasımıza ait Prototipi belirten abstract classını tasarlamaktır.

public abstract class MySite
{
    public abstract Mshowto Kopyala();
}

Prototipe ait class içerisinde bulunan abstract türündeki Kopyala adlı metodumuz geriye Prototip tipinden bir değer döndürmektedir. Bu sayede Prototip classımızdan miras alan classların, Prototip classımızın abstract olması sebebiyle new ile yeni bir nesne oluşturulamayacağından dolayı kendisinin geriye döndürülmesini sağlayacaktır.

Prototip tanımımızı yaptıktan sonra artık üyelerimize ait bilgilerin tutulacağı sınıfımızı tasarlayabiliriz.

public class Uye : MySite
{
    public enum UyelikTipleri
    {
        Yönetim,
        Editör,
        Yazar,
        Uye
    }
 
    public string Ad { get; set; }
    public string Soyad { get; set; }
    public UyelikTipleri UyelikTipi { get; set; }
 
    public Uye(string ad,string soyad,UyelikTipleri uyeliktipi)
    {
        Ad = ad;
        Soyad = soyad;
        UyelikTipi = uyeliktipi;
    }
 
    public override MySite Kopyala()
    {
        return this.MemberwiseClone() as Uye;
    }
}

Uye sınıfımızda miras aldığımız Prototipimiz içerisinde bulunan abstract türündeki Kopyala metodunu ezerek içerisinde sınıfı tüm özellikleriyle kopyalamayı sağlayan MemberwiseClone metodunu kullandık.

Ancak MemberwiseClone metodu object tipinden veri döndürdüğü için ve bizim döndürmemiz gereken tip classın kendi tipi olması gerektiğiden dolayı as Uye komutu ile bu problemi çözüyoruz.

Artık üyelerimize ait tanımı yapabilir ve belirtmiş olduğumuz listemizi hazırlayabiliriz.

static void Main(string[] args)
{
    List Uyelerimiz = new List();
 
    Uye uye1 = new Uye("Erkan", "Kilmen", Uye.UyelikTipleri.Yönetim);
 
    Uyelerimiz.Add(uye1);
 
    Uye uye2 = uye1.Kopyala() as Uye;
    uye2.Ad = "Yazar";
    uye2.Soyad = "Uyemiz";
    uye2.UyelikTipi = Uye.UyelikTipleri.Yazar;
 
    Uyelerimiz.Add(uye2);
 
 
    Uye uye3 = uye1.Kopyala() as Uye;
    uye3.Ad = "Editör";
    uye3.Soyad = "Üyemiz";
    uye3.UyelikTipi = Uye.UyelikTipleri.Editör;
 
    Uyelerimiz.Add(uye3);
 
}

çıktı
Hazırladığımız tasarım desenimiz sayesinde yeni üye tanımlarında new anahtar sözcüğünü kullanmamıza gerek yoktur. Bunun yanında yeni malzeme ve yeni ürün ekleme işleminde tek yapmamız gereken Yeni eklediğimiz tipin portatif sınıfı miras alması ve kopyala metodunun ezilerek sınıfa ait tipin döndürülmesidir.

Bu makalede kullanılan tasarım desenine ait kodu indirmek için ………..

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.