Factory Design Pattern

Factory pattern design patternler arasında en başta gelenlerden biri olması sebebiyle buradan başlayıp ileride bahsedebildiğim kadar çok design pattern'den bahsetmeye çalışacağım.

   

Factory pattern adındanda anlaşılacağı gibi bir creational pattern (diğer örnekleri; abstract factory, builder, stereotype etc.), yani nesne yaratmamızı ve yaratılacak nesneyi seçememize imkan veriyor. Gerçek hayata uygun bir senaryo ile konuyu anlatmaya çalışacağım.

   

Yukarıda gördüğünüz diagramda iki büyük yuvarlak var bunları Kırmızı: UI - Client , Yeşil: Logic olarak düşünelim. Clientimiz ekrana şekil çizdermek istiyor bunun için Rectange, Triangle, Circle class'larinin birinden nesne yaratmalı ve draw methodunu çağırmalı. Draw() methodunun IShape interface'I içinde olduğunu düşünelim. Triangle, Rectangle ve Circle class'lari Ishape'I implement etmiş ve Draw() methodunu içeriyor. Client basit bir şekilde Triangle t = new Triangle(); t.Draw(); şeklinde bir komut ile Triangle çizdirebilir. Ancak yarın eklenecek yeni bir şeklin çizdirilmesi için client kodunda değişiklik gerekir. Bu sorunu önlemek için client sadece IShape interface'ini ve Factory class'ini bilir. Factory class'I tüm Triangle Rectangle Circle gibi classlari bilir. Client, factory üzerinden create komutu ile beraber istediği türün ismini veya key değerini parametre olarak vererek factorynin bir nesne yaratmasını ister. Factory içinde yaratılan tüm nesneler Ishape'I implement ettiği için; factory, client'a IShape türünde bir nesne gönderir ve Client gelen nesnenin Ishape olduğu için Draw(); methodunu içerdiğini bilir, böylece Draw(); methodunu çağırarak ekrana yazdırabilir.

   

Bu sayede gelecekte yarataılacak diğer class'lar için client kodunda değişiklik gerekmez örneğin ileride Ellipse isimli bir class yaratmak istersek class'I yaratıp factory içinde değişiklik yapmamız yeterli olacak. Ellipse bir IShape olduğu için sorun çıkmadan ve çok az kod değişikliği ile sisteme eklenebilir. Client tarafında hiç bir ekstra kod yazmaya gerek kalmadan sisteme ekleme yapılmış olur.

   

Kodlara bakalım

   

   

Örneğin Ellipse class'ini eklersek aşağıdaki kod'a ulaşmış olacağız. Gördüğünüz gibi yeni bir class eklemek dışında tek değişiklik Factory üzerinde yapıldı ve Client'ta hiç bir değişiklik gerekmedi.

   

   

Bonus Part (Reflection)

   

Peki bu tip değişikliklerin sadece class eklemek ile tamamlanmasını ve Factory üzerinde kod değişikliği yapmak istemezsek nasıl yapabiliriz? OOP gereği bu yöntemi ben pek tercih etmesemde, c#'in (java etc. dillerde aynı özellikler mevcut) reflection ile bu işi yapabiliriz. Aşağıda gödüğünüz kod ile artık her eklenen IShape implement etmiş class otomatik olarak client tarafından kullanılabilir hale gelmektedir.

   

   

Yukarıda göreceğiniz. "FactoryPattern". + typeName ile nesne yaratmak istediğimiz class adını ifade ediyoruz. "FactoryPattern." yazmamın sebebi benim application'imin default namespace'I "FactoryPattern" ve yeni oluşturulacak IShape implement eden class'in FactoryPattern namespace'inde olduğunu varsayıyorum.


Kodlara aşağıdaki linkten ulaşabilirsiniz.


https://github.com/altinokdarici/DesignPatterns

Yorum ekle

Loading