Örnek (Prototip) Tasarım Kalıbı (Prototype Design Pattern)

Eyl 08, 2013

Prototip deseni belirli nesnelerin kopyasını oluşturarak daha sonra yapılacak işlemler için, oluşturulan kopyanın kullanılmasını sağlayan yaratımsal desendir.

Örnek Tasarım Kalıbının Kullanımı

Prototip deseninde referans türünden nesneler bir nesne kopyalama şekli olan deep-copy(derin-kopyalama) metodu ile kopyalanabilir. Bu metodda yeni referans değişkenine atanması için nesneler kopyalanır. Bu, bellekte aynı türden iki nesnenin oluşturulması anlamına gelmektedir.

Örnek Tasarım Kalıbının Yapısı

Prototip deseni concrete (somut) prototip, abstract (soyut) prototip ve client (istemci) olarak üç önemli yapıyı bünyesinde barındırmaktadır. Somut prototip uygulamalarda kullanılan asıl nesnelerdir. Soyut prototip ise içerisinde kopyalama işlemini yürüten bir metodun bulunduğu bir sınıf ya da yalnızca bildirimlerin yer aldığı sınıftır. Client (İstemci) somut prototip nesnelerinin kopyasını oluşturur. Bu yapıların anlaşılması için gerçekleştirilen C# uygulaması aşağıda görülmektedir.

    abstract class SoyutPrototip
    {
        public string prototipismi;

        public SoyutPrototip(string pisim)
        {
            prototipismi = pisim;
        }

        public abstract SoyutPrototip Clone();
    }

    class SmtPNesne1: SoyutPrototip
    {
        public SmtPNesne1(string pisim) : base(pisim) { }

        public override SoyutPrototip Clone()
        {
            return (SoyutPrototip)MemberwiseClone();
        }
    }

    class SmtPNesne2: SoyutPrototip
    {
        public SmtPNesne2(string pisim) : base(pisim) { }

        public override SoyutPrototip Clone()
        {
            return (SoyutPrototip)MemberwiseClone();
        }
    }

    class Yazdırma
    {
        public void Yaz()
        {  
            SmtPNesne1 s1 = new SmtPNesne1("BIDB2 kopya nesne");
            SmtPNesne1 s1_kopyanesne = (SmtPNesne1)s1.Clone();
            SmtPNesne2 s2 = new SmtPNesne2("BIDB4 kopya nesne");
            SmtPNesne2 s2_kopyanesne = (SmtPNesne2)s2.Clone();
            s1.prototipismi = "BIDB1";
            s2.prototipismi = "BIDB3";
            Console.WriteLine(s1.prototipismi.ToString());
            Console.WriteLine(s1_kopyanesne.prototipismi.ToString());
            Console.WriteLine(s2.prototipismi.ToString());
            Console.WriteLine(s2_kopyanesne.prototipismi.ToString());
        }
    }

    class Istemci
    {
        static void Main(string[] args)
        {
            
            Yazdırma a = new Yazdırma();
            a.Yaz();
        }
    }

Kopyalama işlemi SoyutPrototip metodu ile yapılacaktır. Yapıcı metod kullanıldığı için sınıf ismimiz ile metod ismi aynıdır, ayrıca yapıcı metod kullanıldığından herhangi bir değer döndürülmediğine dikkat ediniz. Buna ek olarak Object sınıfına ait olan protected erişim belirleyicisinin üye elemanı olan MemberWiseClone metodu ile kopyalama işlemi yapılmıştır. Orjinal işlemler ile birlikte kopyalama işlemlerini yazdırma işlemi son olarak Yazdırma sınıfının yaz metodu ile yapılmıştır. Buna bağlı olarak ekran çıktısı şöyle olmaktadır.

           
         

UML Diyagramı

UML (Unified Modelling Language – Birleşmiş Modelleme Dili ) sınıf diyagramı kullanılan yapı doğrultusunda şöyle gösterilebilir.