CreationalC#verifiedVerified

Abstract Factory Pattern in C#

Provides an interface for creating families of related objects without specifying their concrete classes.

How to Implement the Abstract Factory Pattern in C#

1Step 1: Define abstract product interfaces

public interface IButton
{
    string Render();
}

public interface ICheckbox
{
    string Render();
}

2Step 2: Define the abstract factory

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

3Step 3: Concrete products for Light theme

public class LightButton : IButton
{
    public string Render() => "[Light Button]";
}

public class LightCheckbox : ICheckbox
{
    public string Render() => "[Light Checkbox]";
}

4Step 4: Concrete products for Dark theme

public class DarkButton : IButton
{
    public string Render() => "[Dark Button]";
}

public class DarkCheckbox : ICheckbox
{
    public string Render() => "[Dark Checkbox]";
}

5Step 5: Concrete factories

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();
}

6Step 6: Client works only with factory interface

public class Application(IUIFactory factory)
{
    private readonly IButton _button = factory.CreateButton();
    private readonly ICheckbox _checkbox = factory.CreateCheckbox();

    public string RenderUI() =>
        $"{_button.Render()} {_checkbox.Render()}";
}

Abstract Factory Pattern Architecture

hourglass_empty

Rendering diagram...

lightbulb

Abstract Factory Pattern in the Real World

Imagine furnishing a room from IKEA versus a luxury boutique. Each store (factory) produces a complete set of furniture — chairs, tables, sofas — that share a consistent style. You pick the store, and every piece you get matches. You never mix a rustic IKEA chair with a baroque boutique table.