Giriş

Uygulamanız birden fazla nesne türü üretiyorsa, doğrudan new anahtar kelimesiyle yönetmek kod karmaşasına yol açar. İşte bu noktada Factory Pattern, nesne yaratma sorumluluğunu merkezi bir sınıfa devrederek loosely-coupled, test edilebilir bir yapı sunar.
Bu yazıda:

  1. Factory Pattern nedir?
  2. Kurulum ve temel örnek
  3. Katmanlı mimaride nerede kullanılır?
  4. Gelişmiş senaryolar (Parametre ile seçim, Reflection vs.)
  5. Avantaj & Dezavantajlar

1. Factory Pattern Temel Kavramları

  • Creator (Factory): Nesne oluşturma mantığını barındırır.
  • Product (Interface/Abstract): Ortak arayüz veya soyut sınıf.
  • ConcreteProduct: Product’ın farklı implementasyonları.
  • Client: Sadece Factory üzerinden Product alır, doğrudan new çağırmaz.

2. Kurulum ve Basit Örnek

Product Arayüzü

public interface IShape
{
    void Draw();
}

ConcreteProduct’lar

public class Circle : IShape
{
    public void Draw() => Console.WriteLine("Circle çizildi.");
}

public class Square : IShape
{
    public void Draw() => Console.WriteLine("Square çizildi.");
}

ShapeFactory

public static class ShapeFactory
{
    public static IShape Create(string type)
    {
        return type.ToLower() switch
        {
            "circle" => new Circle(),
            "square" => new Square(),
            _        => throw new ArgumentException("Geçersiz tip.")
        };
    }
}

Client Kullanımı

var shape1 = ShapeFactory.Create("circle");
shape1.Draw(); // Circle çizildi.

var shape2 = ShapeFactory.Create("square");
shape2.Draw(); // Square çizildi.

Factory sayesinde new Circle() veya new Square() çağrısı Client’ta hiç görünmez.

3. Katmanlı Mimaride Kullanımı

Katman Factory Rolü
Application Create(...) metodu burada yer alır
Domain IShape ve Circle, Square sınıfları
API Controller’ın, ShapeFactory’ı çağırması

4. Gelişmiş Senaryolar

Parametreli Factory

public static IShape Create(ShapeType type)
{
    return type switch
    {
        ShapeType.Circle => new Circle(),
        ShapeType.Square => new Square(),
        _                => throw new ArgumentOutOfRangeException()
    };
}

Reflection Tabanlı Factory

public static IShape Create<T>() where T : IShape, new()
    => new T();

Configurable Factory

var map = new Dictionary<string, Type>
{
    ["circle"] = typeof(Circle),
    ["square"] = typeof(Square)
};

public static IShape Create(string key)
{
    var type = map[key];
    return (IShape)Activator.CreateInstance(type);
}

5. Avantajlar & Dezavantajlar

Avantajlar

  • Loose Coupling: Client, somut sınıflardan ayrı kalır.
  • Tek Sorumluluk: Factory tek bir yerde nesne yaratmayı yönetir.
  • Test Edilebilirlik: Mock Factory ile test kolaylaşır.

Dezavantajlar

  • Ekstra Kod: Basit senaryolarda gereksiz katman oluşturabilir.
  • Bakım Maliyeti: Çok sayıda ConcreteProduct olduğunda Factory karmaşıklaşır.

İleri Okuma ve Kaynaklar

6. Sonuç

  • Factory Pattern, oluşturma sorumluluğunu soyutlar ve Client kodunu sadeleştirir.
  • Katmanlı mimarilerde merkezi bir nokta sayesinde bakım ve genişletme kolaylaşır.
  • Gelişmiş senaryolarda Reflection veya config tabanlı yaklaşımlar tercih edilebilir.

By tanju.bozok

Software Architect, Developer, and Entrepreneur

Bir yanıt yazın

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