Factory Method(Design Pattern)
Kelime anlamı “Fabrika Metodu” olan Factory Method, üst sınıfta nesneler oluşturmak için bir arabirim sağlayan, ancak alt sınıfların oluşturulacak bu nesne türünü değiştirmesine izin veren bir yaratımsal desen (creational pattern) türüdür. Hepimizin anlayabileceği bir biçimde anlatmak gerekirse bir üst sınıf oluşturup, alt sınıfların bu üst sınıfın methodlarını kullanması (inheritance).
Kullanacağım içerikler ağırlıklı olarak refactoring.guru ve evrenbal.com sitesinden alınmıştır.
Örnek Problem
Bir lojistik yönetimi uygulaması oluşturduğunuzu hayal edin. Uygulamanızın ilk sürümü yalnızca kamyonlarla taşıma işlemini gerçekleştirebilir, bu nedenle kodunuzun büyük bir kısmı “kamyon” sınıfı içerisinde bulunur.
Bir süre sonra uygulamanız oldukça popüler hale gelir. Her gün deniz taşımacılığı şirketlerinden deniz lojistiğini uygulamaya dahil etmek için onlarca talep alıyorsunuz.
Harika haber, değil mi? Peki ya kod? Şu anda, kodunuzun çoğu sınıfa “kamyon” sınıfındadır. Uygulamaya “gemi” sınıfını eklemek istediniz, kodun tamamında değişiklik yapmanız gerekmektedir. Ayrıca, daha sonra uygulamaya başka bir ulaşım türü daha eklemeye karar verirseniz, muhtemelen tüm bu değişiklikleri tekrar yapmanız gerekecektir.
Çözüm
Factory Method modeli, doğrudan nesne oluşturmak yerine özel bir factory method çağrısına (new öperatörü kullanarak) dönüştürmeyi öneriyor. Nesneler hala new
operatörü ile oluşturuluyor ama fabrika metodu içerisinden çağrılıyor. Fabrika metodunun döndürdüğü nesneler de ürün olarak adlandırılıyor.
Bu değişiklik ilk bakışta anlamsız görülebilir: nesnenin oluşturulması çağrısını prograın bir yerinden alıp başka bir yerine taşıdık. Fakat şöyle düşünün, artık elinizde bir alt sınıf içerisinde ezerek oluşturacağı ürünün sınıfını değiştirebileceğiniz bir metod var.
Fakat burada bir sınırlama söz konusu: Alt sınıfların farklı ürünler döndürebilmesi için bu ürünlerin ortak bir sınıf (class) ya da arayüze (interface) sahip olmaları gerekiyor. Ayrıca ana sınıftaki fabrika metodunun geri döndürdüğü değerin tipi bu arayüz olarak tanımlanmak zorunda.
Örneğin hem Kamyon
hem de Gemi
sınıfları tasi
adında bir metod içeren Transport
Interface’ini esas almalı. Her iki sınıfta metodu farklı esas alacaktır; kamyonlar malı karadan taşırken gemiler deniz yoluyla taşıyacaktır. KaraLojistigi
sınıfı kamyon nesnesi döndürürken DenizLojistigi
sınıfı gemi döndürecektir.