Abstract Factory

Crea familias de objetos relacionados sin especificar sus clases concretas.

Contexto

Tu app necesita renderizar UI que cambia según el sistema (Windows/macOS/Web). Cada familia (botón, ventana, scrollbar) debe ser coherente: no mezclar un botón macOS con un scrollbar Windows.

Problema
  • Mantener coherencia entre objetos relacionados.
  • Permitir cambiar de familia entera sin tocar al cliente.
Solución

Una interfaz (IUIFactory) declara métodos para crear cada miembro de la familia. Cada concreta (MacFactory, WinFactory) garantiza que todos los objetos pertenecen al mismo conjunto.

#Ejemplo en C#

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

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

public class MacFactory : IUIFactory
{
    public IButton CreateButton()     => new MacButton();
    public ICheckbox CreateCheckbox() => new MacCheckbox();
}

public class WinFactory : IUIFactory
{
    public IButton CreateButton()     => new WinButton();
    public ICheckbox CreateCheckbox() => new WinCheckbox();
}

public class App
{
    private readonly IUIFactory _ui;
    public App(IUIFactory ui) => _ui = ui;

    public void Render()
    {
        _ui.CreateButton().Render();
        _ui.CreateCheckbox().Render();
    }
}
Cuándo NO aplicarlo
  • Cuando solo hay una familia y no se prevén más.
  • Cuando las familias no comparten estructura (entonces cada producto evolucionará en distinta dirección).
Tradeoffs
Pro Contra
Garantiza coherencia entre productos Añadir un nuevo producto a la familia rompe TODAS las factorías
Cliente desacoplado de las concretas Indirección extra

#creational #gof #family