Factory Method Design Pattern
Hi guys (başlığın tamamı İngilizce olunca, yazıya da böyle başlamak geldi içimden)! Efendim, bir önceki makalemizde “Tasarım Desenleri” konusuna giriş yapacağımı söylemiştim. Şimdi de bu serinin ilk makalesini kaleme alma vakti.
Öncelikle, kategorinin adını açıklayarak başlayalım işe. Yaratımsal (creational) tasarım desenleri, karmaşık bir mimaride sınıftan bir örnek (instance) üretirken kullanılan desenlerdir. Tasarım desenleri yazımda da belirttiğim gibi, desenler; “sık karşılaşılan sorunların bir çözümüdür”. Öyleyse, bir tasarım desenini anlamanın en iyi yolu öncelikli olarak problemle karşılaşmaktır.
Dilerseniz Factory Method Design Pattern’in çözmüş olduğu problemi, günlük hayattan bir örnekle görelim (tabii ki). Diyelim ki yeni bir eve taşınacaksınız ve oturma grubunuzu da o eve uygun olacak şekilde seçmek istiyorsunuz. Mobilyacıya gittiniz ve bir de baktınız ki farklı büyüklüklerde ve fiyatlarda birçok koltuk çeşidi mevcut. İşte problem! Seçimi hangi kritere göre yapacaksınız? Bu durumda hemen aklınıza belirlemeniz gereken iki parametre gelmiş olmalı. Bunlardan birincisi bütçeniz diğeri de evin salonunun boyutları olacaktır. Bu iki parametre ile mobilyacıya danıştığınızda istediğiniz kriterlere uygun bir mobilyayı daha rahat bir biçimde bulabilirsiniz.
İşte bu örnekte; mobilyacınız, sizin için uygun olan mobilyayı sağlayan Factory metodunu içeren sınıftır.
Dolayısı ile, şimdi teknik bir tanım yapabiliriz. Factory Method deseninin ana amacı, “genişletilebilirlik” tir. Birbirinden yapısal olarak farklı ancak aynı zamanda birçok karakteristik özelliği ortak olan nesnelerin yönetimi, oluşturma kıstaslarının belirlenmesi ve yaratılması için Factory Metodu kullanılır.
Şimdi söz konusu deseni, teknik bir örnekle açığa kavuşturalım.
İlk olarak, olaya çok basit yaklaşalım. Diyelim ki, bir ev dekorasyon simülatörü üretiyorsunuz ve kullanıcının seçimlerine göre üretilen mobilyaları belirtilen alana yerleştirmek istiyorsunuz. Her mobilyanın standart olan özelliklerini (en, boy, genişlik, şekil, renk vs.) bir Interface’de tutabilir ve tüm mobilyaları bu Interface’den implemente edebilirsiniz değil mi?
Bu durumda size ihtiyaç duyduğunuz mobilya nesnesini üretebilecek bir sınıfa gereksiniminiz var demektir. O zaman gelin bu sınıfı oluşturup, “oluşturma” sorunumuzu çözelim:
Gördüğünüz gibi, Factory metodum bir parametre alıyor (enum) ve bu parametrenin değerine göre istenen nesneyi üretip döndürüyor. İşte Factory metot tasarım deseninin en sade ve basit örneği bu.
Şimdi gelin bu çözümü daha farklı bir örnekte yeniden inceleyelim.
Örneğimizde bir blog sistemi ya da CMS (Content Management System) projesine giriştiğimizi varsayalım. Böyle bir projede olmazsa olmaz diyebileceğimiz konulardan biri kullanıcı rolleri ve bu rollerin izinleridir. Söz gelimi yönetici rolündeki bir kullanıcının yetkileri ile editör ya da normal kullanıcıların yetkileri birbirlerinden farklıdır. Buradaki roller sistemin ihtiyaçlarına göre çoğalabilecek durumdalar öyle değil mi?
Demek ki böyle bir mimaride (OCP prensibine de hatırlatarak), abstract bir Izin sınıfı oluşturur ve tüm izinleri bu sınıftan türetirsem anlamlı bir adım atmış olurum:
Tamamdır. Şimdi, roller kendi içinde bu izinlerin bir koleksiyonunu barındırması gerektiğini biliyoruz. Ayrıca birden fazla rol olacağına göre benzer bir mimariyi rol için de kurgulayabiliriz. İşte burada kullanacağımız abstract rol sınıfında, role göre yetki oluşturulmasını sağlayacak abstract bir “izinleriOlustur” metodu oluşturacağız. İşte bu metot, bizim factory metodumuz olacak!
Gelelim kod tarafına. Önce Izin sınıfının kodlarına bakalım:
Ardından da Rol abstract sınıfını görelim:
Şimdi sevgili dostlar; her rolün bu factory metodunu nasıl ezdiklerine bakalım:
Şimdi sıra geldi Main metodunu yazma kısmına:
Son olarak da çıktımıza bir bakalım:
Gördüğünüz gibi dostlar, bir nesneye (rol) bağlı olan (dependency) ortak nesneleri (izin) üretebilmek için Factory metot tasarım desenini kullandım. Bu noktada Factory metodun kurallarını özetleyelim:
- Metot, bir nesne oluşturmalı
- Metot, abstract class ya da interface döndürmeli
- Bu abstract class veya Interface’ler başka sınıflar tarafından implemente edilmeli.
Evet sevgili dostlar; tasarım desenleri serisinin ilk desenini böylece incelemiş olduk. Bir sonraki DP makalesinde görüşmek üzere…
Kendinize özgüvenle bakın.
Hoşçakalın.
devamını bekliyoruz hocam :))
Bir yazılım makalesine göre fazla akıcı ve yalın anlatım kullanılmış, keyifle okudum. 🙂
“(Factory) Metot, abstract class ya da interface döndürmeli” cümlesi başka örnekler için doğru olabilir ama yukarıdaki örnekteki factory metod void dönmüş. Kafa karıştırabileceği için uyarmak istedim. Yine de anlatılmak isteneni anlatıyor.
baba büyüksün
Fazlasiyla iyi.
Harikasın hocam. Güzel anlatım.
Teşekkürler hocam
teşekkürler. yıl 2019 belki yazarken hangi yıllara kadar gidecek diye düşünmüşsündür. 🙂
Hocam çokkk teşekkürler emeğinize sağlık. Harika bir anlatım şişman adam:)) Diğer tasarım kalıpları hakkında yazılarınızı bekliyorum.