Design Patterns — Creational

Mert Kimyonşen
3 min readSep 5, 2020

Bir önceki yazı için Design Patterns

Merhabalar,

Tasarım kalıpları yazılım geliştirme sürecinde hayatımızı kolaylaştıran kalıplardır desek yanlış olmaz. Tasarım kalıplarını hatırlayacak olursak; yazılım tasarımında sürekli kendini tekrar eden problemlere yeninden kullanılabilen (reusable) çözümler üretir.

Tasarım kalıplarını kullanarak yazılım geliştirme aşamasında ortaya çıkan problemlere kolay ve pratik bir çözüm uygulayabiliriz. Amerika’yı baştan keşfetmeye gerek yok :). Bu tasarım kalıplarını göz önünde bulundurursak karşımıza çıkan problemleri hızlı ve etkili bir şekilde çözebiliriz.

Bu yazıda Tasarım Kalıplarının ilk kategorisi olan Creational Patterns (Yaratımsal/Oluşturucu Kalıplar) ele alıp en sık kullanılan Abstract Factory Pattern ile örneklendirilecektir. O zaman Let’s go!

Creational Patterns (Yaratımsal/Oluşturucu Kalıplar)

Yaratıcılığını gizle!

Creational tasarım kalıpları, bir sınıftan new anahtar sözcüğü ile nesne üretmeyi gizleyerek programın akışına göre alternatif nesne üretme çözümleri sunan tasarım kalıplarından oluştur.

Gof kitabına göre; Creational Patterns 5 adet tasarım kalıplarından oluşur;

  • Abstract Factory Pattern
  • Factory Method Pattern
  • Singleton Pattern
  • Builder Pattern
  • Prototype Pattern

Bu tasarım kalıplarının kullanım sıklığı

  • Abstract Factory Pattern: Yüksek
  • Factory Method Pattern: Yüksek
  • Singleton Pattern: Orta
  • Builder Pattern: Düşük
  • Prototype Pattern: Orta

Abstract Factory Pattern

Abstract Factory Pattern, concrete (somut) sınıfları belirtmeden ilgili ve bağımlı nesnelerin oluşması için onlara interface (soyut) sağlar. Nesnenin hangi şekilde oluştuğu ile ilgilenmez, nesnenin hangi arayüzü desteklediği ile ilgilenir.

Ne Sağlar?

  • Ürün ailelerinin oluşumunu istemci tarafından ayırarak, karar verme koşulu olmadan, esnek ve geliştirilebilir bir yapı kurmamızı sağlar.

Ne zaman kullanmalıyız?

  • İhtiyaç duyulan nesneleri bağımsız yaratmak istediğimizde
  • Birden fazla ürün ailesi ile çalıştığımızda, ürün ailesinin oluşmasını istemci tarafından ayırmak istediğimizde

Uml Diagram

İstemci (client) bir ürün istediğinde bunu direkt oluşturmak yerine ilgili AbstractFactory arayüzüne başvurur. Bu sayede istemci ile nesnenin oluşması soyutlama üzerinden bağımsız olur.

Örnek uygulamamıza başlayabiliriz;

Oyun geliştirmeye başaladığımızı düşünelim ve oyun karakterlerini oluşturmak için yaşadığımız problemi Abstract Factory Pattern ile çözmek istiyoruz. Oyunda Assian ve Europe karakterleri var ve her bir karakterin yetenekleri ve özel güçlerinini oluşturacağız.

Katılımcılar

  • AbstractFactory (ICharacterFactory)
  • ConcreteFactory (AsianCharacterFactory, EuropeanCharacterFactory)
  • AbstractProduct (IAbility, ISuperPower)
  • Product (FastAbility, JumpAbility, FireSuperPower, GuardSuperPower)
  • Client (CharacterManager)

İlk olarak Abstract yapılarımızı oluşturalım.

Abstract (soyut) yapılarımız hazır olduğuna göre concrete (somut) yapılara geçebiliriz; ICharacterFactory interface ile karakterin yetenek ve süper güçlerini oluşturacağımız temel yapıyı hazırladık.

IAbility ve ISuperPower interfaceleri ile oluşturmak istediğimiz karakterin karakteristik özelliklerini inşa edeceğiz. O yüzden bu interfaceleri uygulayacağımız concrete (somut) yetenekler ve süper güçler tanımlamalıyız.

Yeteneklerimiz: Hız ve atlama, Süper güçlerimiz: Ateş ve Kalkan.

Şimdi sıra bu nesneleri oluşturacak ConcreteFactory yapılarımızda. ICharacterFactory interface’den türeyen Assian ve Europe karakterleri oluşturmak için ilgili sınıfları oluşturalım.

Artık Asian ve European karakterleri oluşturacak yapımız hazır. Şimdi sıra bu yapıyı yönetebileceğimiz Client sınıfını oluşturmak;

Client yapımızın tek ilgilendiği ona sağlanan arayüzler. Bu sayede client yapısı ne yeteneklere ne de süper güçlere bağlı oldu. Tamamen soyutlanmış durumda.

Şimdi bu yapıyı kullanalım. Console uygulaması üzerinden kullanım örneğini oluşturalım;

Vee sonuç;

Console uygulamasında örnek bize ne anlatıyor?

Assian ve Europe türlerini barındıran bir liste oluşturduk ve bu listedeki her elemanı Client yapımıza inject ettik. 2 farklı türden Factory var ama Client bununla ilgilenmiyor tek ilgilendiği ona sağladığımız Factory arayüzleridir. Aynı zamanda Client yapımız gevşek bağlı (loosely coupled) yeteneğini de kazandırmış oduk. Bu sayede Client tarafını soyutlayarak karar verme koşulu olmadan esnek, geliştirilebilir bir yapı tasarlamış olduk.

Creatioanl Patterns ve ona bağlı olan Abstract Factory Pattern hakkında elde ettiğim bilgileri paylaşmaya çalıştım. Umarım faydalı olmuştur.

Bir sonraki yazımda yazmayı planladığım tasarım kalıbı; Structural Patterns ve ona bağlı en çok kullanılan bir tasarım kalıbını örnek üzerinde açıklamak olacak.

Sağlıkla kalın!

--

--