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?
- 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(). - Es facilísimo de extender: Si mañana quieres agregar Discord, solo creas la clase
Discordy la agregas al diccionariocanales. No tienes que modificar ni un soloif.
Tu turno (Reto de 2 minutos)
Intenta agregar un nuevo canal llamado Telegram al código anterior:
- Crea la clase
Telegramcon su métodoenviar(self, texto). - Agrégalo al diccionario de la fábrica
"telegram": Telegram. - Pídele a la fábrica
"telegram"y prueba enviar un mensaje.
¡Felicidades! Acabas de aplicar tu primer patrón de diseño.