Factory Method es un patrón de diseño creacional que proporciona una interfaz para crear objetos en una superclase, pero permite a las subclases alterar el tipo de objetos que se crearán.
Propósito y Caso de Uso
El patrón Factory Method sugiere reemplazar las llamadas directas de construcción de objetos (usando el operador new) por llamadas a un método fábrica especial. Es ideal cuando no sabes de antemano los tipos exactos y las dependencias de los objetos con los que debe trabajar tu código.
Ventajas Principales (SOLID):
- Evita el acoplamiento fuerte: Desacopla el código cliente de las clases de productos concretos.
- Principio de Responsabilidad Única (SRP): Centraliza el código de creación de productos en clases creadoras específicas.
- Principio de Abierto/Cerrado (OCP): Puedes incorporar nuevos tipos de productos en la aplicación sin romper el código cliente existente.
Estructura del Patrón
La arquitectura conceptual consta de cuatro elementos principales:
- Producto (Interfaz): Declara la interfaz común a todos los objetos que pueden ser creados por el creador y sus subclases.
- Productos Concretos: Implementaciones distintas de la interfaz de producto.
- Creador (Clase Abstracta / Interfaz): Declara el método fábrica que devuelve nuevos objetos de producto.
- Creadores Concretos: Sobrescriben el método fábrica base para devolver una instancia de un producto concreto distinto.
Cómo Funciona
- Definición de Interfaz: Define una interfaz uniforme para todos los productos (ej.
Notification). - Implementación Concreta: Implementa clases concretas (ej.
EmailNotification,SMSNotification,PushNotification). - Jerarquía del Creador: Define un creador abstracto con el método fábrica
createNotification(). - Delegación a Subclases: Las subclases sobrescriben el método fábrica para devolver instancias específicas según la lógica de negocio.
Ejemplos de Implementación en el Mundo Real
// 1. Interfaz de Producto
interface Notification {
send(message: string, recipient: string): void;
}
// 2. Productos Concretos
class EmailNotification implements Notification {
send(message: string, recipient: string): void {
console.log(`[EMAIL] Enviando "${message}" a ${recipient}`);
}
}
class SMSNotification implements Notification {
send(message: string, recipient: string): void {
console.log(`[SMS] Enviando "${message}" a ${recipient}`);
}
}
class PushNotification implements Notification {
send(message: string, recipient: string): void {
console.log(`[PUSH] Enviando "${message}" al dispositivo ${recipient}`);
}
}
// 3. Creador (Clase Abstracta)
abstract class NotificationFactory {
// Método Fábrica
public abstract createNotification(): Notification;
// Lógica principal de negocio basada en el método fábrica
public notify(message: string, recipient: string): void {
const notification = this.createNotification();
notification.send(message, recipient);
}
}
// 4. Creadores Concretos
class EmailNotificationFactory extends NotificationFactory {
public createNotification(): Notification {
return new EmailNotification();
}
}
class SMSNotificationFactory extends NotificationFactory {
public createNotification(): Notification {
return new SMSNotification();
}
}
class PushNotificationFactory extends NotificationFactory {
public createNotification(): Notification {
return new PushNotification();
}
}
// Uso Cliente
function clientCode(factory: NotificationFactory) {
factory.notify("¡Tu pedido ha sido enviado!", "usuario@ejemplo.com");
}
clientCode(new EmailNotificationFactory());
clientCode(new SMSNotificationFactory());Caso Práctico en Código
Si deseas ver una refactorización real de un panel de administración en React/TypeScript aplicando este patrón junto con SOLID y YAGNI, consulta nuestro ejemplo práctico:
💡 Ver Caso Práctico: Ejemplo Práctico del Patrón Factory