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 — declara FactoryMethod() abstracto y opera sobre Product.
  • ConcreteCreator — devuelve un ConcreteProduct.

#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