💡 Ver Caso Práctico: Ejemplo Práctico del Patrón Abstract Factory
Abstract Factory es un patrón de diseño creacional que permite producir familias de objetos relacionados o dependientes entre sí, sin especificar sus clases concretas.
Propósito y Caso de Uso
Utiliza Abstract Factory cuando tu código deba trabajar con varias familias de productos relacionados (por ejemplo, componentes de UI para tema claro/oscuro, o clientes de notificación para distintos entornos) y necesites garantizar que los productos de una misma familia sean siempre compatibles entre sí. A diferencia del Patrón Factory Method, que crea un producto, Abstract Factory crea familias completas de productos.
Estructura del Patrón
- Productos Abstractos: Interfaces para cada tipo de producto de la familia (ej.
Button,Checkbox). - Productos Concretos: Implementaciones específicas por variante (ej.
DarkButton,LightButton). - Fábrica Abstracta: Declara un método de creación por cada producto abstracto.
- Fábricas Concretas: Implementan la fábrica abstracta produciendo una familia coherente de productos.
Flujo de Funcionamiento
- Selección: El cliente recibe (o resuelve) una fábrica concreta según el contexto (tema activo, entorno, región).
- Creación desacoplada: El cliente llama a los métodos de la fábrica (
createButton(),createCheckbox()) sin conocer las clases concretas. - Coherencia garantizada: Todos los productos creados por una misma fábrica pertenecen a la misma familia y son compatibles entre sí.
Ejemplos de Implementación Reales
// Productos abstractos
interface Button {
render(): string;
}
interface Checkbox {
render(): string;
}
// Familia: Tema Oscuro
class DarkButton implements Button {
render(): string { return '<button class="btn-dark">OK</button>'; }
}
class DarkCheckbox implements Checkbox {
render(): string { return '<input type="checkbox" class="chk-dark" />'; }
}
// Familia: Tema Claro
class LightButton implements Button {
render(): string { return '<button class="btn-light">OK</button>'; }
}
class LightCheckbox implements Checkbox {
render(): string { return '<input type="checkbox" class="chk-light" />'; }
}
// Fábrica abstracta
interface UIFactory {
createButton(): Button;
createCheckbox(): Checkbox;
}
class DarkThemeFactory implements UIFactory {
createButton(): Button { return new DarkButton(); }
createCheckbox(): Checkbox { return new DarkCheckbox(); }
}
class LightThemeFactory implements UIFactory {
createButton(): Button { return new LightButton(); }
createCheckbox(): Checkbox { return new LightCheckbox(); }
}
// Uso: el cliente solo conoce UIFactory
function renderForm(factory: UIFactory): string {
return factory.createButton().render() + factory.createCheckbox().render();
}
renderForm(new DarkThemeFactory());Cuándo NO usarlo
Si solo tienes un producto que crear (no una familia relacionada), Abstract Factory añade complejidad innecesaria (YAGNIGlosarioYAGNI (You Aren't Gonna Need It)Principio de Extreme Programming (XP) que establece que un programador no debe añadir funcionalidad hasta que sea estrictamente necesario. Su objetivo es evitar la sobre-ingeniería (over-engineering), previniendo código para funcionalidades hipotéticas.Ver término completo →); usa Factory Method en su lugar.