C#'ta Prototype Design Pattern

C#'ta Prototype Design Pattern'i öğrenelim.

Prototype Design Pattern

Hatırlayacağınız gibi Creational Patterns bir yada daha fazla nesnenin oluşturulması ve yönetilmesi ile ilgili patternlerden oluşan gurubu temsil ediyordu. Prototype Pattern yeni bir nesne oluşturmak yerine varolan oluşturulmuş bir nesneden klonlama yöntemi ile yeni bir nesne örneği elde etmek için kullanılıyor.

Kullanım nedenleri

  • Nesnenin diğer oluşturulacak nesnelere model olması amacıyla prototipinin oluşturulması ve bu prototipten oluşturulacak nesnelere örnek teşkil etmesi, hazır yapı sunması.
  • Üretim için kalıp oluşturması, diğer üretimler için bu kalıbın kullanılması.
  • Bir nesnenin oluşturulma maliyetinin yüksek olması nedeniyle defalarca oluşturulacak aynı nesneler için bir model nesne oluşturmak ve diğer oluşturulacak nesneleri yeniden yaratmadan model nesneden klonlamak bu yöntemle nesne üretim maliyetini düşürmek.

Örneğin yeni bir nesne oluşturulmak isteniyor. Çeşitli hesaplama ve değerlendirmeler sonucu nesnenin içerisi dolduruluyor.

Yeni bir nesne oluşturma zaman maliyeti 1 sn sürüyor ve bu nesne sık tekrarlanan kullanıma sahip. 20 kullanımlık bir talep geldi. Üretim için harcanan zaman 20 x 1 = 20 sn

Bunu klonlamak nesne başı 0.5ms x 20 = 100 mili sn yani saniyenin 10 da biri toplamda harcanacak süre. (Tahmini rakam)

Prototype Pattern ile oluşturulan nesneler klonlandığı nesnenin bire bir özelliklerini taşımakla beraber genişletebilir bir yapıya da sahiptirler.

Ne tür örnekler verebiliriz ?

Çizim programında belirli bir şeklinin çizim alanına defalarca eklenmesi.

Oyunlarda bir silahtan defalarca mermi atılması ve her bir merminin bir nesne ile temsili gibi.. Biz örneğimizde Bilgisayar ve yazıcı arasında gerçekleşen bir senaryoyu konumuza uyarlamaya çalışacağız.

Yazdırma işleminde yazıcıya ait bilgilerin sistemden alındığı bir nesnemiz olacak. Her yazdırma işleminde bu nesne gibi bir nesneye ihtiyaç duyulacak.

Sık tekrarlanan bir kullanım ihtiyacı olduğundan ya her seferinde yeni bir nesne oluşturulacak yada zaten oluşturulmuş bir nesne kendinden sonra kullanılacak nesnelere model oluşturacak.

Prototype: Bir abstract class veya interface olacak. İçerisinde Clone isimli metot bulunacak.

Concrete Prototype: İşleme konu olan nesnemiz. (Prototype yapısını uyguladığı için Clone metodunu uygulamak, ezmek zorunda)

(Prototype Pattern uygulanacak sınıf sayısı kadar ConcertePrototype yapısı oluşturulabilir. Biz bir sınıfa uygulayacağız.)

Client: İstemci uygulamamız

(Concrete Prototype) Printer isimli sınıfımız bir printer'ın tanımlandığı, cihaz özelliklerinin sistemden alındığı ve nesnenin doldurulduğu bir yapı. Bu sınıf (Prototype) PrinterPrototype abstract sınıfını uyguluyor. Böylece Clone metodunu kullanması zorunlu hale geliyor. (Client) üzerinde yeni bir printer nesnesi oluşturuluyor. PrintDocument fonksiyonuna yeni bir nesne oluşturmadan varolanı klonlayarak gönderiyor. Böylece Printer class içerisindeki constructor çalışmıyor ve nesne için new işlemi gerçekleşmiyor. Printer sınıfı constructor içerisine işlemin oluşum süresi için 1 sn'lik gecikme ekledim. Eğer her seferinde yeni nesne oluşturulursa yazdırılacak sayfa sayısı kadar 1 sn harcanacak. Varolan klonlanırsa yeni nesne üretilmediğinden Constructor yapısı içerisine hiç girilmeyecek ve bu gecikme hiç olmayacak.

namespace ConsoleApplication1

{

//Prototype

abstract class PrinterPrototype

{

public abstract PrinterPrototype Clone();

}


//Concrete Prototype

class Printer : PrinterPrototype

{

public byte Address { get; set; } public string Name { get; set; }

public bool ColorCartridge { get; set; }

public bool BlackCartridge { get; set; } public int ResolutionDpi { get; set; } public string PaperSize { get; set; }


public Printer(byte address, string name, bool colorCartridge, bool blackCartridge, int resolution, string paperSize)

{

Address = address; Name = name;

ColorCartridge = colorCartridge; BlackCartridge = blackCartridge; ResolutionDpi = resolution; PaperSize = paperSize; System.Threading.Thread.Sleep(1000);

}


public override PrinterPrototype Clone()

{

// Klonlama işlemi. Gelen nesnenin bir kopyası alınıp sonuç olarak döndürülüyor.

return (PrinterPrototype)this.MemberwiseClone();

}

}


//Client class Program

{

static void Main()

{

// Prototype model nesne oluşturuluyor.

Printer printer = new Printer(0x0F, "Hp", true, true, 600,

"A4");


for (int i = 0; i < 20; i++)

{

PrintDocument((Printer)printer.Clone(), i.ToString());

Console.WriteLine(Convert.ToString(i + 1) + " nolu sayfa

basıldı");

}


Console.WriteLine("Yazdırma tamamlandı..."); Console.ReadLine();

}


static void PrintDocument(Printer printer, string content)

{

// Print işlemi yapan metod.

}

}

}

 

Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git