8/24/2009

Fabrika Tasarım Deseni ( Factory )

Heralde en çok kullanılan ve bilinen tasarım desenidir. GOF bu deseni yaratılışsal desenler arasında sınıflandırmıştır. Bir desenin yaratılışsal desen olarak niteliklendirilmesi için bu desenin çözüm getirdiği problemin bir sınıfın nesnesinin yaratılışı ile ilgili olduğunu söyleyebiliriz.

Tanımı : Bir nesnenin yaratılması için arayüz sağlayan desendir. Nesnenin hangi sınıftan oluştulacağına, arayüzü uygulayan alt fabrika sınıfları karar verir.
İlk bakışta yukarıdaki tanımın bir insan evladına manalı gelebilmesi, özellikle bu tasarım deseni ile ilk kez karşılaşacak bir kişi için, zor görünüyor:) Aşağıda belki biraz daha manalı gelebilecek bir UML diyagramı üzerinden gitmek en iyi olacak. Tasarım desenleri araştırdıkça, aynı desene ait farklı varyasyonlar göreceksiniz. Bu sizi şaşırtmasın, desenin özü nasıl uygulandığından çok hangi probleme çözüm getirdiğindedir. En basit türev üzerinden gitmekte fayda var.


Genelde yalın kullanımının gerçekleştirildiğini söylemekte fayda var. Bana da daha pratik geliyor ama akademik düzeyde bakacak olursanız, kapsamlı kullanım referans edilmiştir. Peki yandaki UML diyagramları nedir?

Bir soyut sınıfın, hangi somut alt sınıfı ile gerçekleneceğini bilmeden (daha doğrusu bu mantığı saklayarak) kullanımını ifade eder. Nesnenin yaratılış mantığı ise fabrika sınıfı içerisinde saklıdır.
Örneğimiz için yukarıdaki UML diyagramında kullanılan kavramları örnekteki üyelerle eşleyim :

ASinifi :CsvAktarici
BSinifi : ExcelAktarici
Fabrika : AktariciFabrikasi
Tuketici : Console



Yukarıdaki kodda ne oldu? Aktarici fabrikası vasıtasıyla, IAktarici arayüzünü gerçekleyen bir
sınıfın nesnesini yaratmış oldum. Bu şekilde nesne yaratılış mantığını, fabrika sınıfına tekrar kullanılabilir bir şekilde gömüldü. Aklımdan neler geçiyor dersek:

· Kullanıcı(console) hangi kaynağa aktarım yapacağını hard-code olarak bilmiyor.
· Yeni bir aktarım kaynağını oluşturduğum vakit sadece fabrika sınıfını güncellemem yeterli olacaktır(Daha akıllı bir fabrika ile güncellemesem de olabilecek bir yapı kurulabilirdi mesela).
· İstersem nesne yaratılış mantığını değiştirebilirim (mesela format geçersiz hatası yerine varsayılan bir aktarım kaynağı atayabilirim) .
· Kod ve tasarım kalitesi daha yüksek .
· Eğer kapalı bir API yazıyor olsaydım, API kullanıcılarına kendi aktarım kaynaklarını oluşturabilecekleri daha akıllı bir fabrika oluştururdum.
· Fabrika sınıfıyla, hangi sınıfın örneğinin yaratılacağına karar verdiğim gibi, nasıl yaratılabileceğini(hangi state’de) de teşkil eden bir yapı kurabilirdi.

Yukarıdaki kod bir referans olması için değil; en basit manada bir örnek olması için yazılmıştır. Çok değişik şekillerde de gerçekleştirilebilirdi. Özellik daha akıllı(mesela reflection kullanılarak) fabrika sınıflarıyla çok daha güzel işler yapılabilirdi. Çokça örnek incelemekte fayda var.

Umarım bakış açınıza bir katkısı olmuştur.

Hiç yorum yok: