Creational — Oluşturucu Desenler

Abstract Factory

Soyut Fabrika Deseni

Amaç: Birbiriyle ilişkili veya birlikte kullanılması gereken nesne ailelerini, somut sınıflarını belirtmeden oluşturmak için bir arayüz sağlamak.

1

Basit Anlatım

Teknik terim yok — günlük hayattan bir benzetme

Bir mobilya mağazasına gittiniz ve salonunuz için takım almak istiyorsunuz: koltuk, sehpa ve kitaplık. Mağazada Modern, Klasik ve Rustik koleksiyonlar var.

Modern bir koltuğun yanına klasik, oymalı bir sehpa koyarsanız uyumsuz görünür. Bu yüzden mağaza size "Hangi koleksiyonu istersiniz?" diye sorar. Siz "Modern" dediğiniz anda tüm parçalar o koleksiyondan gelir ve birbiriyle uyumlu olur.

Fark nerede?

Fabrika Metodu tek bir ürünü üretiyordu. Soyut Fabrika ise bir ürün ailesi üretir. Her koleksiyon aslında bir "fabrika"dır ve o fabrika yalnızca kendi tarzında parçalar üretir.

Abstract Factory şunu der: "Tarzı bir kez seç; o tarza ait her parça otomatik olarak birbiriyle uyumlu gelsin."
2

Teknik Anlamı

Bir yazılımcının bakış açısıyla

Abstract Factory, birden fazla ilişkili ürün için factory metotlarını tek bir arayüzde toplar. Her somut fabrika, belirli bir varyantın (tema, platform, veritabanı vb.) tüm ürünlerini üretir.

Katılımcılar

Gerçek dünya kullanımları

Avantajlar

Dezavantajlar

3

C# ile Uygulama

Adım adım, çalışan kod örneği

Senaryo: Açık (Light) ve koyu (Dark) temaları olan bir arayüz kütüphanesi. Bir ekranda düğme ve onay kutusu aynı temadan olmalı.

Adım 1 Soyut ürünler

public interface IButton   { string Render(); }
public interface ICheckbox { string Render(); }

Adım 2 Her temanın somut ürünleri

public class LightButton : IButton
{
    public string Render() => "[ Beyaz düğme, siyah yazı ]";
}
public class LightCheckbox : ICheckbox
{
    public string Render() => "[x] Açık renk onay kutusu";
}

public class DarkButton : IButton
{
    public string Render() => "[ Siyah düğme, beyaz yazı ]";
}
public class DarkCheckbox : ICheckbox
{
    public string Render() => "[x] Koyu renk onay kutusu";
}

Adım 3 Soyut fabrika ve somut fabrikalar

Her fabrika yalnızca kendi ailesinin ürünlerini üretir, böylece karışıklık olması imkânsızdır.

public interface IUiFactory
{
    IButton CreateButton();
    ICheckbox CreateCheckbox();
}

public class LightThemeFactory : IUiFactory
{
    public IButton CreateButton() => new LightButton();
    public ICheckbox CreateCheckbox() => new LightCheckbox();
}

public class DarkThemeFactory : IUiFactory
{
    public IButton CreateButton() => new DarkButton();
    public ICheckbox CreateCheckbox() => new DarkCheckbox();
}

Adım 4 İstemci: yalnızca soyutlamaları bilir

public class LoginScreen
{
    private readonly IButton _button;
    private readonly ICheckbox _rememberMe;

    public LoginScreen(IUiFactory factory)
    {
        _button = factory.CreateButton();
        _rememberMe = factory.CreateCheckbox();
    }

    public void Show()
    {
        Console.WriteLine("  " + _rememberMe.Render());
        Console.WriteLine("  " + _button.Render());
    }
}

Adım 5 Kullanım

Tüm parçaları bir araya getiren istemci (client) kodu:

bool userPrefersDark = true;   // ör. kullanıcı ayarlarından gelir

IUiFactory factory = userPrefersDark ? new DarkThemeFactory() : new LightThemeFactory();
Console.WriteLine($"Seçilen fabrika: {factory.GetType().Name}");
new LoginScreen(factory).Show();

Console.WriteLine("Tema değiştirildi:");
new LoginScreen(new LightThemeFactory()).Show();

Konsol çıktısı

Seçilen fabrika: DarkThemeFactory
  [x] Koyu renk onay kutusu
  [ Siyah düğme, beyaz yazı ]
Tema değiştirildi:
  [x] Açık renk onay kutusu
  [ Beyaz düğme, siyah yazı ]

Kodda dikkat edilmesi gerekenler

Özetle: Abstract Factory, birlikte çalışması gereken nesneleri aile halinde üretir. Aileyi değiştirmek için yalnızca fabrikayı değiştirirsiniz.
← Ana sayfaya dön