Factory Tasarım Deseni

header_factory

Yaratımsal kategoride yer alan diğer tasarım deseni factory desenidir.Aynı arayüze veya soyut sınıfı uygulayan sınıfların nesnelerinin oluşturulmasından sorumludur.Bu sınıflardan nesne oluşturma işlemi  sınıfın uyguladığı arayüz veya soyut sınıf aracılığıyla fabrika sınıfları tarafından oluşturulur.

diagram_factory

Yukarıda bir sınıftan nesne oluşturulmasına yönelik bir diagram görüyorsunuz.Yeni yazdığımız bir sınıftan nesne oluşturmak istediğimizde doğrudan new anahtar kelimesini kullanarak nesne yaratım işlemini gerçekleştirebiliriz.Bu desen ile istemci kodun bu sınıftan nesne oluşturması için araya factory yapısını yerleştiriyoruz.Desenin mantıksal modeli bu şekildedir.Teknik açıdan bakıldığında bir kaç kalıtılmış sınıfından nesne üretilmesi için kullanılır.

Factory deseni ile bir sınıfın nesne oluşturma ve fonksiyonellikleri birbirinden ayrılmış olur.İstemci kod doğrudan asıl sınıfın fonksiyonelliğine erişemez.Asıl sınıfın fonksiyonellikerine erişmek için factory methodu veya sınıfı aracılığıyla asıl sınıfından bir instance oluşturur ve bu şeklide fonksiyonelliklere erişebilmiş olur.İstemci ve işi yapacak olan sınıf fonksiyonellikleri birbirinden ayrıldığı için gevşek bağımlılık sağlanmış olur.

Bu desenin Enterprise Library içerisinde Unity blogu içerisinde kullanıldığını buradan görebiliriz.Örneğin bir bankacılık istemi içerisinde bir çok çeşit ödeme dosyası sistemde izlenilen bir dizine düşüyor.Bu dizine düşen dosyaları işlemeniz ve bu bilgileri sistem içerisine entegre etmeniz gerekiyor.Burada dosya tipine bağlı olarak (xml,txt,xlsx) farklı işler yapacaksınız fakat dosya tipinden bağımsız olarak dosyayı açmanız(open), belirli validasyonlardan geçirmeniz (valid) ve ayrıştırmanız (parse) gerekiyor.Bu gibi ortak özellikler için arayüz tanımlanır.Her bir dosya tipi için tüm fonksiyonları içeren ayrı ayrı sınıflar yazılıp bu işlemleri o şeklide gerçekleştiririz.Bu gibi ortak karakteristiği olan sınıfların nesne örneğinin oluşturulması için bu deseni kullanımı güzel bir strateji olabilir.

Tasarım

factory-implementation

Yukarıda en temel şekli ile factory deseninin UML şemasını görüyorsunuz.Factory desenin temel olarak 2 farklı şeklide uygulama yöntemi vardır.Birinci yöntemde nesnelerin oluşturulması için Creator veya Factory soneki almış bir sınıf bir sınıf içerine tek bir method araılığıyla oluşturulur.Diğer yöntemde ise her nesne için ayrı bir factory sınıf yazılır.İki yönteminde yaptığı iş aynı kurgusu farklıdır.Fakat ikinci yöntemi tercih ettiğimizde yeni eklemeler daha rahat olacaktır.

Factory Method

Aşağıda ilk yöntem için yazılan kod örneğini görüyoruz.Burada dökümanları okumak için altyapı oluşturulmaya çalışıyor.Burada generic kullanım şeklini de görüyorsunuz.

Factory Sınıfı

Bu yöntemde ise concrete sınıflarımız için factory sınıfları yazıyoruz.Yani PDFReader ve MsWordReader sınıfları için PDFReaderFactory ve MsWordReaderFactory sınıflarını tanımladık.Kullanım kısmında göreceğiniz gibi nesne örnekleri için bu factory sınıflarını kullanıyoruz.

Örnek Kodlama

Örnek kodlamamızda Muhasebe gerçekleştirim işlemi için sınıf yapılarını oluşturmaya çalışlıyoruz.Burada muhasebesi yapılacak işlemin türünden (yurtiçi,yurtdışı,avrupa ödemesi) bağımsız olarak Teknik bazı ortak fonksiyonellikleri var bunun için interface ve soyut sınıf tanımladım.Kurguladığım bu örnek için her bir asıl sınıf için factory sınıfları tanımladım ve muhasebe akış sınıfı için bu factory sınıflarını kullandım.

Örnek kodlarımızın sınıf diagramını görelim.

 

capture_diagram

Sonuç

Birbirine yapısal olarak farklı ama bazı ortak özelliklere sahip -interface veya abstract kalıtımı- sınıfların nesnelerinin oluşturulmasını sağlar.Aynı zamanda nesne oluşturma sürecini merkezi hale getirerek belirli kriterlere göre hangi nesnenin oluşturulacağı gibi kararlarının alınmasına da yardımcı olur.

İlişkili olduğu desenler

  • Null Object Pattern ; hiç bir duruma girmeyen durumlarda var sayılan olarak nesne gönderilmesi durumunda NULL tanımlı bir nesne örneğinin gönderilmesi düşünülebilir.

Şimdilik bu kadar.Yazıda yanlış olarak ifade edilen noktalar görürseniz lütfen yorumlayın :D

Leave a Reply

Your email address will not be published. Required fields are marked *