Factory Method(Design Pattern)

Metin Topcu
2 min readMar 15, 2023

--

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.

Lojistik Şirketi ve Taşımalık yaptığı araçlar(Şuan için sadece kamyon)

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.

Alt sınıflar fabrika metodunun döndürdüğü nesne sınıfını değiştirebilir.

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.

Tüm ürünler aynı ara yüzü paylaşmak 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.

Tüm ürün sınıfları ortak bir ara yüz paylaştığı sürece ilgili objeleri içiniz rahat şekilde çağıran koda döndürebilirsiniz.

Diğer Tasarım Kalıpları İçin Linkler

Singleton

Iterator

Observer

--

--

Metin Topcu
Metin Topcu

No responses yet