Prototype Design Pattern

Prototype Design Pattern

Nesneleri new operatörüyle oluşturmanın maliyeti olduğundan, bu maliyeti azaltmayı amaçlayan tasarım kalıplarından bir tanesidir. Aslında prototype design patterni çok dallandırıp budaklandırmaya ve karmaşıklaştırmaya gerek yoktur. Prototype design patterninin bize söylediği şey, elinde bir nesne var ise ve sen bu nesnenin birebir kopyasını bir çok kez daha yaratmak zorundaysan, sıfırdan yaratma onun yerine elinde olan nesnenin clonelarını al. Yani adından da anlaşılacağı üzere bir nesne prototip oluyor. Diğer nesneler de bu prototip üzerinden üretiliyor. İşin güzel yanı çoğu framework bize bir nesnenin clone’unu almak için hazır fonksiyonlar sunar. Bu da demektir ki prototype desing patterni implemente ederken çok kod yazmamıza da gerek kalmıyor.  Bu klonlama(kopyalama) işleminde, deep-copy yöntemi kullanılıyor. Yani bir nesne, birebir kopyalanarak yeni bir referans değişkene atılıyor.

Aşağıdaki örnekte Product classı içerisinde kendini clonelayabilmesinin sağlanması için .net’in bize sunduğu MemberwiseClone() fonksiyonu kullanılmıştır. Tek yapılması gereken class’ın bir instance’ını yaratmak ve sonrasında bu instance üzerinden clone fonksiyonunu kullanmaktır.

 namespace ConsoleApp
 {
    //bu classı implemente eden classlar içerideki metodu uygulamak zorunda olduklarından metot da AventurePrototype'ı döndürmek zorunda olduğundan
    //ki kendi de abstract olduğundan türeyen tip kendi çalışma zamanını geriye döndürmekle yükümlüdür
     abstract class AdventurePrototype 
     {
        public abstract AdventurePrototype Clone();
     }

     //Concrete Prototype
     class Product : AdventurePrototype 
     {       
         public int ProductId { get; set; }
         public string Name { get; set; }
         public decimal ListPrice { get; set; }

         public Product(int productId, string name, decimal listPrice)
         {
           ProductId = productId;
           Name = name;
           ListPrice = listPrice;
         }
 
         public override AdventurePrototype Clone()
         {
          return this.MemberwiseClone() as AdventurePrototype;
         }
     }

     class Program
     {
        static void Main(string[] args)
        {
           Product lcdTv = new Product(1000, "ABC Lcd TV 106", 1000);
           //bunu ürettikten sonra yarın öbürgün bunun seri üretimine geçmek istediğimizi düşünelim.

           Product lcdTV2 = lcdTv.Clone() as Product;

          Console.ReadKey();
        }

    }

 }