Factory Method
Define una interfaz para crear un objeto, pero deja que las subclases decidan qué clase instanciar.
Contexto
Tu código instancia clases concretas con new por todas partes. Cuando aparece una nueva variante (otro proveedor, otro formato, otro canal), tienes que tocar decenas de archivos.
Problema
- Acoplas el código cliente a clases concretas.
- Cada nueva variante implica modificar el código existente, violando OCP.
Solución
Mueve la creación a un método polimórfico (Create) que las subclases sobrescriben. El cliente trabaja con la interfaz y nunca llama a new de la concreta.
#Estructura
Product— interfaz del objeto creado.ConcreteProduct— implementaciones específicas.Creator— declaraFactoryMethod()abstracto y opera sobreProduct.ConcreteCreator— devuelve unConcreteProduct.
#Ejemplo en C#
public interface INotification { Task SendAsync(string to, string body); }
public class EmailNotification : INotification
{
public Task SendAsync(string to, string body) => /* SMTP */ Task.CompletedTask;
}
public class SmsNotification : INotification
{
public Task SendAsync(string to, string body) => /* Twilio */ Task.CompletedTask;
}
public abstract class NotificationDispatcher
{
protected abstract INotification Create(); // Factory Method
public Task DispatchAsync(string to, string body) =>
Create().SendAsync(to, body);
}
public class EmailDispatcher : NotificationDispatcher
{
protected override INotification Create() => new EmailNotification();
}
public class SmsDispatcher : NotificationDispatcher
{
protected override INotification Create() => new SmsNotification();
}Cuándo NO aplicarlo
- Cuando solo tienes una variante y no se prevén más → es ceremonia inútil.
- Cuando ya tienes DI: una
Func<INotification>registrada suele bastar.
Tradeoffs
| Pro | Contra |
|---|---|
| Cumple OCP, se añaden variantes sin tocar al cliente | Más clases que mantener |
| Aísla la elección de la creación | Puede esconder complejidad real bajo herencia |
#Variantes
Mira Parameterized Factory Method (un solo creador con enum/string).
#creational #gof #polymorphism