Programlamada Tasarım Desenleri #2 — Factory Design Pattern (C# .NET)

Tasarım desenleri, yazılım geliştiriciler için tekrar eden problemlere karşı denenmiş ve onaylanmış çözüm yollarıdır. Bu yazı dizimizin ikinci bölümünde, yaratıcı (creational) tasarım desenleri arasında en çok kullanılanlardan biri olan Factory Design Pattern‘i (Fabrika Tasarım Deseni) inceleyeceğiz. Örnek uygulamaları C# .NET ile yapılmıştır.

Bu deseni tam anlamıyla kavradığınızda proje mimarinizin nasıl sadeleştiğini ve test edilebilirliğin arttığını göreceksiniz.


Factory Design Pattern Nedir?

Factory Pattern, nesne oluşturma sürecini soyutlayarak, hangi sınıfın örneğinin oluşturulacağına alt sınıfların karar vermesini sağlar. Bu sayede kodunuz:

  • Genişletmeye açık,
  • Değişikliğe kapalı (*Open/closed principle*);
  • Daha az bağlı ve daha bakımı kolay olur.

Factory Pattern UML Diyagramı

Kaynak: Wikimedia Commons – UML diyagramı ile Factory Pattern yapısı


Factory Design Pattern Kullanım Senaryoları

Factory Pattern şu durumlar için oldukça uygundur:

  • Nesne yaratma sürecinin merkezi kontrol altında olması istendiğinde
  • Yeni sınıf eklemelerinde kod içi değişiklik yapmak istemediğinizde
  • Karmaşık nesne oluşturma işlemleri gerektiğinde

Gerçek Hayattan Bir Analoji: Araba Üretimi

Fabrika deseni adını gerçek hayattaki fabrikalardan alır. Düşünün ki bir otomobil fabrikamız var ve bu fabrika birkaç marka üretmekte: Toyota, BMW, Audi…

Bir sipariş verildiğinde, hangi marka isteniyorsa ona uygun üretim hattı çalışır ve gerekli araba üretilir. Biz her defasında üretim mantığı ile uğraşmak zorunda kalmayız, sadece ne istediğimizi söyleriz.

Araba Fabrikası


C# .NET ile Factory Pattern Nasıl Uygulanır?

Şimdi örnek bir senaryo düşünelim: Farklı bildirim (notification) türlerini yöneteceğimiz bir uygulama geliştiriyoruz. SMS veya E-posta bildirimleri oluşturmak istiyoruz.

1. Adım: Ortak Arayüz (Interface) Tanımlama


public interface INotification
{
void Send(string message);
}

2. Adım: SMS ve Email Sınıflarını Oluşturma


public class EmailNotification : INotification
{
public void Send(string message)
{
Console.WriteLine($"Email gönderildi: {message}");
}
}

public class SmsNotification : INotification
{
public void Send(string message)
{
Console.WriteLine($”SMS gönderildi: {message}”);
}
}

3. Adım: Fabrika Sınıfı Yazımı


public class NotificationFactory
{
public static INotification CreateNotification(string channel)
{
switch (channel.ToLower())
{
case "email":
return new EmailNotification();
case "sms":
return new SmsNotification();
default:
throw new ArgumentException("Geçersiz bildirim türü.");
}
}
}

4. Adım: Kullanım (Client Code)


class Program
{
static void Main(string[] args)
{
Console.Write("Bildirim türü girin (email/sms): ");
string channel = Console.ReadLine() ?? "email";

INotification notification = NotificationFactory.CreateNotification(channel);
notification.Send(“Merhaba, Factory Pattern kullanıldı!”);
}
}


Factory Pattern’ın Avantajları

  • ✅ Yeni sınıf eklemek kolaydır, sadece bir case daha eklersiniz.
  • ✅ İstemci (client) sınıflar, hangi sınıfın örneğini kullandığını bilmez.
  • ✅ Bağımlılık düşük, esneklik yüksek olur.

Dezavantajları

  • ⚠️ Karmaşık desenin yanlış uygulanması kodu gereksiz yere karmaşıklaştırabilir.
  • ⚠️ Çok fazla ufak sınıf ortaya çıkabilir, bu da kod yönetimini zorlaştırabilir.

Factory Pattern vs Abstract Factory Pattern

Sıkça karıştırılan iki desen:

  • Factory Method Pattern: Tek nesne oluşturur.
  • Abstract Factory Pattern: Nesneler grubu üretir. Örneğin bir GUI toolkit’in tüm bileşenlerini (düğme, menü, vs.) üretir.

Blog serimizin ilerleyen bölümlerinde Abstract Factory desenine de değineceğiz. Takipte kalın 📌


Test Edilebilirlik ve Dependency Injection ile Kullanım

Factory pattern, DI (Dependency Injection) ile yanlış kullanılırsa bağımlılığı gizleh hale getirebilir. Bunun yerine bazen Factory yerine interface üzerinden doğrudan DI kullanılması tavsiye edilir. Ancak runtime’da dinamik karar verilmesi gereken durumlarda Factory olmazsa olmazdır.


Sık Yapılan Hatalar

  • Factory sınıfına çok fazla sorumluluk yüklemek
  • Factory’nin if-else veya switch ile şişmesi (Bu durumda Strategy Pattern daha uygun olabilir)

Sonuç: Ne Zaman Factory Pattern Kullanmalı?

Factory Pattern, projenizdeki karmaşık nesne yaratımı işlemlerini soyutlamak ve bağımlılığı düşürmek için güçlü bir araçtır. Ancak ihtiyacınız olmayan yerde kullanmak kodunuzu sadece karmaşıklaştırır.

🔧 En iyi kullanım senaryosu: Yeni sınıfları sisteme dahil etmenin kolay olması gerektiği projeler.


📝 Bu yazı dizimizin sonraki bölümünde: Abstract Factory Pattern‘i detaylandıracağız.

Yorumlarınızı aşağıya bırakın, siz Factory Pattern’ı hangi projelerde tercih ettiniz?

📩 Yazılım geliştirme ve tasarım desenleriyle ilgili benzer içerikler için blogumu takip etmeyi unutmayın!


Sıkça Sorulan Sorular (FAQ)

Q: Factory Pattern hangi tasarım deseni kategorisine girer?
A: Creatonal (Yaratımsal) tasarım desenidir.

Q: Interface olmadan Factory Pattern uygulanabilir mi?
A: Evet, ama interface kullanımı esneklik ve test kolaylığı sağlar.

Q: Factory Pattern performansı etkiler mi?
A: Performans kaygısı genellikle çok düşüktür; okunabilirlik ve yönetilebilirlik kazancı daha büyüktür.


📌 Etiketler: factory design pattern, c# .net, tasarım desenleri, factory method, creational design pattern, interfaces, object creation, dependency injection


Factory Pattern UML Diyagramı
Factory ve Abstract Factory karşılaştırması

Factory Pattern Bilgi Grafiği

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir