14 Kasım 2012 Çarşamba

Design Patterns - Factory Patterns

Merhaba Arkadaşlar,
 
 
Bu yazımızda Türkçesi Tasarım Desenleri olan Design Patterns serisine giriş yapacağız. Aslında aman aman öyle yeni birşey anlatmayacağız. Daha önceki serimiz olan Design Principles kavramlarının baz alarak sıkça rastlanan sorunlara bulunan çözümleri anlatmaya çalışacağız.

Ama önce en son yazımızda ne yazdığımız ile ilgili bilgi vermek istiyorum. (Lost izleyenler flash backleri severler:))

En son yazımızda Dependency Inversion prensibini incelemiştik. Bu prensibte  değişmesi öngörülen alt sınıfların soyutlaştırılmasından bahsettik.

Tasarım Desenleri serimize çoğu üstadın ve arkadaşlarımızın aksine Factory deseni ile başlamak istiyorum(Fabrika diyince insanın içi bir hoş oluyor. Acaba kendimi fabrikatör gibi hissetmemi sağladığından olabilir mi :P ).

Arkadaşlar Fabrika diyince aklımıza ilk gelen şey nedir? Seri üretim yapan, ürettiği şeylerin birbirine benzediği, üretimden sorumlu olduğu bina veya yapılardır.

Bakkala gittiğimiz zaman çikolata almak istediğimizde bize ambalajlı, kapağı olan, cam veya plastik kapta, içi çikolata dolu bir ürün verirler. Ürünün oluşturulması ile ilgili son kullanıcıya iş bırakılmaz.

Yani tekrar bakkala gidelim(Bu sefer başka bakkala gidelim. Ekonomiye can verelim :P) . Çikolota isteyelim. Bize bakkal amca yukarıda yazdığımız ambalaj, kapak, cam, kap, ve çikolotayı verse al kardeşim sen kendin bunu tak, çıkar, koy birşeyler yap sonra yersin. Ne olurdu tepkimiz ?

Factory deseni de işte burada noktaya giriyor. Benim gördüğüm iki noktaya son kullanıcı adına çözüm buluyor.
  • Ürünün üretilmesi
  • Birden çok aynı tip ürünün tek bir noktadan üretilmesi
Şimdi gelelim örnek yapımıza o kadar çikolatalardan bahsettik fabrikamız da çikolata fabrikası olmasında bir sakınca görmüyorum :)

Uml diagramlarımıza bakarsak pek hayırlı bir kod olmadığı ortada :) Cinsleri aynı nesnelerin bir üst sınıftan türetmemek kod hamallığından başka bir şey değil arkadaşlar.
 
Kodumuza gelirsek,
 
Alpella Sınıfımız:
 


Metro Sınıfımız:

Program Sınıfımız:


 


Arkadaşlar kod resimlerinin bazıları bulanık gibi gözüküyor. Yazının sonunda uygulamanın kodlarını ekleyeceğim.

Konumuza dönersek; Farkettiğiniz gibi çikolataları alma ve oluşturma işlemlerini Program sınıfı yapıyor. Yukarıda yazdığımız senaryo da bakkaldan çikolata parçalarını almak ve birleştirmemiz gibi birşeye tekabul ediyor. Bu hem zahmetli bir iş, hem yapılmaması gereken bir iş.

Yukarıdaki kodda bir prensibi de çiğnedik sizce hangisi ? Farkettiyseniz single responsibility prensibini CreateChocolate metodunda çiğnedik. Method hem çikolata oluşturuyor hemde çikolatalar hakkında bilgiyi ekrana basıyor. Bu iki işlemi ayrı metodlara alma işlemini de yeni kodumuza ekleyelim.

 Şimdi kodumuzu düzenleyelim ve bir fabrika deseni kullanarak bu işlemi gerçekleştirelim.

 

 
 
Yeni uml diagramımız yukarıdaki gibi yaparsak sanırım işleri biraz güzelleştirmiş oluruz. Program sınıfı çikolata üretmek için artık uğraşmayacak. ChocolateFactory sınıfından hangi tipten ne kadar istiyor ise o kadar alacak.
 
 

 

Yukarıdaki kod Program sınıfı tarafından ChocolateFactory sınıfından çikolata isteme işlemlerini içeriyor.

Çikolata Fabrikası bu isteği aşağıdaki gibi karşılıyor ve cevap veriyor.



Factory metodu bu şekilde arkadaşlar. Tabi bu kod hala prensiplerimizden bazılarına uymuyor. Open Closed Prensibi burada bizim çakılmamıza neden olur. Sisteme her yeni çikolata eklediğimizde ChocolateFactory sınıfımızı da güncellememiz gerekecek. OCP prensibini uygulamak adına burada reflection yöntemiyle sınıfları ayağa kaldırma işlemi yapılabilir.
 
Umarım size bir fabrikatör olmanın ne kadar kolay olduğunu anlatabilmişimdir :). Eğer benim fabrikamda eksik veya yanlış gördüğünüz bir nokta var ise beni bilgilendirmeniz dolayı memnuniyet duyarım .Her  ne kadar parmaklarımız yazmak için caba gösterse de cahil insanlar olarak illaki bir noktaları kaçırmış olabiliriz.
 
Arkadaşlar uygulamanın kodlarını buradan indirebilirsiniz.
 
Bir sonraki yazıda görüşmek üzere. İyi çalışmalar...
 
 
 

Hiç yorum yok:

Yorum Gönder