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.
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.
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
- AbstractFactory: Her ürün için bir oluşturma metodu bildirir (
IUiFactory). - ConcreteFactory: Belirli bir ailenin ürünlerini üretir (
LightThemeFactory,DarkThemeFactory). - AbstractProduct: Her ürün türü için arayüz (
IButton,ICheckbox). - ConcreteProduct: Ailelere özgü somut ürünler (
DarkButtonvb.). - Client: Yalnızca soyut arayüzlerle çalışır.
Gerçek dünya kullanımları
- UI temaları / farklı işletim sistemleri için bileşen setleri.
- Farklı veritabanları için
DbConnection,DbCommandüretimi (.NET'tekiDbProviderFactorytam olarak bu desendir). - Farklı bulut sağlayıcıları (AWS / Azure) için storage + queue istemcileri.
Avantajlar
- Aynı fabrikadan gelen ürünlerin birbiriyle uyumlu olması garanti edilir.
- İstemci kodu somut sınıflardan tamamen ayrılır.
- Bütün aileyi değiştirmek tek satırdır: farklı bir fabrika vermek.
Dezavantajlar
- Aileye yeni bir ürün türü eklemek (ör.
ISlider) tüm fabrikaları değiştirmeyi gerektirir.
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
LoginScreeniçinde hiçbirif (dark)kontrolü yok. Tema kararı tek bir yerde, fabrika seçilirken veriliyor.- Yeni bir "Yüksek Kontrast" teması eklemek için yeni ürün sınıfları ve bir
HighContrastFactoryyazmak yeterli;LoginScreendeğişmez.