Patrón Abstract Factory
El patrón Abstract Factory proporciona una interfaz para crear familias de objetos relacionados sin especificar sus clases concretas. Úsalo cuando tu sistema deba ser independiente de cómo se crean sus productos, especialmente al trabajar con múltiples familias de productos.
Resumen
El patrón Abstract Factory agrupa un conjunto de Factory Methods relacionados bajo una sola interfaz, así una factoría única produce toda una familia de productos compatibles. El ejemplo clásico es un toolkit de UI multiplataforma: una WindowsFactory produce WindowsButton + WindowsCheckbox, una MacFactory produce MacButton + MacCheckbox, y el resto de la app nunca sabe qué familia está usando.
Cuándo usarlo
- Necesitas producir familias de objetos relacionados que deben usarse juntos (ej. componentes de UI con un mismo tema).
- Quieres asegurar a nivel de tipos que los productos de diferentes familias no se mezclen.
- La aplicación debería poder cambiar de familia completa con un solo cambio de configuración.
Ejemplo
interface Button { render(): void }
interface Checkbox { toggle(): void }
interface UIFactory {
createButton(): Button;
createCheckbox(): Checkbox;
}
class DarkButton implements Button { render() { console.log("botón dark"); } }
class DarkCheckbox implements Checkbox { toggle() { console.log("check dark"); } }
class DarkUIFactory implements UIFactory {
createButton() { return new DarkButton(); }
createCheckbox() { return new DarkCheckbox(); }
}
function renderApp(factory: UIFactory) {
factory.createButton().render();
factory.createCheckbox().toggle();
}Ventajas
- Garantiza que los productos de la misma familia se usen en conjunto.
- Aísla las clases concretas — los clientes solo dependen de interfaces abstractas.
- Cambiar de familia (tema, plataforma, entorno) es un cambio de una sola línea.
Desventajas
- Agregar un producto nuevo a la familia obliga a que todas las factorías lo implementen.
- Más clases e interfaces que un Factory Method simple — el costo inicial es real.
- Sobredimensionado cuando solo hay una familia o las familias rara vez cambian.