El patrón Factory en 5 minutos (sin complicarte la vida)

Si estás aprendiendo a programar, es muy común que cuando necesitas crear distintas cosas (como enviar un mensaje por Email, SMS o WhatsApp), termines escribiendo un código lleno de if y elif.

Hoy vas a entender qué es el patrón Factory y por qué te ahorra dolores de cabeza, usando un ejemplo que puedes probar tú mismo en 5 minutos.

1. El problema: El código "Espagueti"

Abre una terminal, crea un archivo llamado app.py y escribe esto:

Python

def enviar_mensaje(canal, texto):
    if canal == "email":
        print(f"📧 Enviando Email: {texto}")
    elif canal == "sms":
        print(f"📱 Enviando SMS: {texto}")
    elif canal == "whatsapp":
        print(f"💬 Enviando WhatsApp: {texto}")
    else:
        print("Canal no soportado")

# Probamos el código
enviar_mensaje("email", "¡Hola Mundo!")

¿Por qué esto se vuelve un problema?

Imagina que tu aplicación crece y ahora quieres agregar Telegram, Discord y Notificaciones Push.

Cada vez que agregues un canal nuevo, tienes que buscar esta función y meterle más elif. Si te equivocas en una línea, rompes todo el sistema de mensajes.

2. La solución: El patrón Factory

La idea del patrón Factory (Fábrica) es muy simple: crea una "fábrica" encargada únicamente de entregarte la herramienta correcta, para que tu código principal solo se preocupe por hacer el trabajo.

Cambia tu app.py por este código:

Python

# 1. Definimos las herramientas (Clases sencillas)
class Email:
    def enviar(self, texto):
        print(f"📧 Email enviado: {texto}")

class SMS:
    def enviar(self, texto):
        print(f"📱 SMS enviado: {texto}")

class WhatsApp:
    def enviar(self, texto):
        print(f"💬 WhatsApp enviado: {texto}")


# 2. La Fábrica (Factory)
def fabrica_notificaciones(canal):
    canales = {
        "email": Email,
        "sms": SMS,
        "whatsapp": WhatsApp
    }
    # Nos devuelve la clase correcta según el texto
    clase = canales.get(canal)
    
    if not clase:
        raise ValueError("Canal no encontrado")
        
    return clase()


# 3. Código principal (El cliente)
canal_usuario = "whatsapp"

# Pedimos la herramienta a la fábrica y enviamos
notificador = fabrica_notificaciones(canal_usuario)
notificador.enviar("¡Tu código está listo!")

3. ¿Por qué esto es mucho mejor?

  1. Tu código principal es limpio: A notificador.enviar(...) no le importa si es un SMS o un Email, solo sabe que tiene un método .enviar().
  2. Es facilísimo de extender: Si mañana quieres agregar Discord, solo creas la clase Discord y la agregas al diccionario canales. No tienes que modificar ni un solo if.

Tu turno (Reto de 2 minutos)

Intenta agregar un nuevo canal llamado Telegram al código anterior:

  1. Crea la clase Telegram con su método enviar(self, texto).
  2. Agrégalo al diccionario de la fábrica "telegram": Telegram.
  3. Pídele a la fábrica "telegram" y prueba enviar un mensaje.

¡Felicidades! Acabas de aplicar tu primer patrón de diseño.