Abstract Factory – familii de obiecte coerente, fără dependințe concrete

  • Doru Bulubasa
  • 05 November 2025

Într-o aplicație complexă, nu e suficient să creezi un singur obiect. De multe ori, ai nevoie de familii de obiecte care lucrează împreună — fără ca logica principală să știe exact ce clase sunt folosite.

Aici intervine Abstract Factory, unul dintre cele mai elegante pattern-uri de creare.


🔍 Ce este Abstract Factory?

Abstract Factory este un pattern de design creational care oferă o interfață pentru crearea de familii de obiecte interconectate, fără a specifica clasele lor concrete.

Scopul său este să izoleze codul client de implementările concrete, permițând schimbarea întregii „familii” de obiecte fără modificări în logica aplicației.


🧠 Analogie simplă

Imaginează-ți că dezvolți o aplicație multiplatformă (.NET MAUI, de exemplu).

Ai nevoie de butoane și ferestre diferite pentru Windows, macOS și Linux, dar interfața aplicației trebuie să rămână aceeași.

În loc să scrii:

if (platform == "Windows")
    button = new WindowsButton();
else if (platform == "Mac")
    button = new MacButton();

poți apela elegant:

var guiFactory = new MacFactory();
var button = guiFactory.CreateButton();
var window = guiFactory.CreateWindow();

Astfel, schimbi întreaga familie de obiecte (buton + fereastră) printr-un singur factory.


⚙️ Implementare în C#

// Abstract Factory
public interface IGUIFactory
{
    IButton CreateButton();
    IWindow CreateWindow();
}

// Produse abstracte
public interface IButton { void Render(); }
public interface IWindow { void Open(); }

// Implementări concrete
public class MacFactory : IGUIFactory
{
    public IButton CreateButton() => new MacButton();
    public IWindow CreateWindow() => new MacWindow();
}

public class WindowsFactory : IGUIFactory
{
    public IButton CreateButton() => new WindowsButton();
    public IWindow CreateWindow() => new WindowsWindow();
}

// Produse concrete
public class MacButton : IButton { public void Render() => Console.WriteLine("Mac Button"); }
public class MacWindow : IWindow { public void Open() => Console.WriteLine("Mac Window"); }

public class WindowsButton : IButton { public void Render() => Console.WriteLine("Windows Button"); }
public class WindowsWindow : IWindow { public void Open() => Console.WriteLine("Windows Window"); }

// Client
class Application
{
    private readonly IGUIFactory _factory;

    public Application(IGUIFactory factory)
    {
        _factory = factory;
    }

    public void Run()
    {
        var button = _factory.CreateButton();
        var window = _factory.CreateWindow();

        button.Render();
        window.Open();
    }
}


🏗️ Avantaje

✅ Separă clar codul client de implementările concrete

✅ Permite schimbarea rapidă a familiei de produse

✅ Promovează consistența între obiectele create

✅ Simplifică testarea și extinderea aplicației


⚠️ Dezavantaje

❌ Codul devine mai complex, cu multe interfețe

❌ Dificil de extins dacă adaugi un produs nou în toate fabricile


💡 Când să folosești Abstract Factory

  • Când aplicația trebuie să funcționeze pe mai multe platforme sau stiluri de UI

  • Când vrei să eviți dependențele directe față de clase concrete

  • Când ai nevoie ca toate obiectele create să fie coerente între ele


🧩 Concluzie

Abstract Factory aduce ordine și consistență în arhitecturile complexe.

Prin el, poți crea ecosisteme coerente de obiecte, fără ca logica aplicației să depindă de detaliile implementării — un pas esențial către cod curat, scalabil și testabil în C#.

🤖 Întreabă AI despre acest articol

AI Răspuns generat de AI pe baza acestui articol.
AI scrie răspunsul…

Scrie un comentariu

Adresa de mail nu va fi publicata. Campurile obligatorii sunt marcate cu *