Ejecuta cualquier ejemplo en nuestra consola interactiva: Abrir consola de Python →
Patrones de diseño en Python
Los patrones de diseño son soluciones probadas para problemas comunes en arquitectura de software. En esta guía aprenderás a implementar patrones clásicos como Singleton, Factory, Strategy, Observer, Decorator y Command adaptados al estilo Python moderno.
Tabla de contenidos
- Singleton
- Factory
- Strategy
- Observer
- Decorator (patrón)
- Command
- Ejercicios
- Mini‑proyecto
1. Singleton
Garantiza que una clase tenga una única instancia.
class Singleton:
_instancia = None
def __new__(cls):
if cls._instancia is None:
cls._instancia = super().__new__(cls)
return cls._instancia
a = Singleton()
b = Singleton()
print(a is b)
2. Factory
Crea objetos sin exponer la lógica de creación.
class Perro:
def hablar(self): return "Guau"
class Gato:
def hablar(self): return "Miau"
def factory(animal):
if animal == "perro": return Perro()
if animal == "gato": return Gato()
print(factory("perro").hablar())
3. Strategy
Permite cambiar algoritmos dinámicamente.
class Suma:
def ejecutar(self, a, b): return a + b
class Resta:
def ejecutar(self, a, b): return a - b
class Calculadora:
def __init__(self, estrategia):
self.estrategia = estrategia
def operar(self, a, b):
return self.estrategia.ejecutar(a, b)
c = Calculadora(Suma())
print(c.operar(10, 5))
4. Observer
Notifica automáticamente a múltiples objetos cuando algo cambia.
class Sujeto:
def __init__(self):
self.obs = []
def agregar(self, o):
self.obs.append(o)
def notificar(self, msg):
for o in self.obs:
o.update(msg)
class Observador:
def update(self, msg):
print("Recibido:", msg)
s = Sujeto()
s.agregar(Observador())
s.notificar("Hola")
5. Decorator (patrón)
Añade funcionalidad sin modificar la clase original.
class Texto:
def render(self): return "hola"
class Mayus:
def __init__(self, comp): self.comp = comp
def render(self): return self.comp.render().upper()
print(Mayus(Texto()).render())
6. Command
Encapsula una acción como un objeto.
class Encender:
def ejecutar(self): print("Encendido")
class Apagar:
def ejecutar(self): print("Apagado")
class Boton:
def __init__(self, comando):
self.comando = comando
def presionar(self):
self.comando.ejecutar()
Boton(Encender()).presionar()
7. Ejercicios
- Implementa un Singleton para configuración global.
- Crea una Factory para vehículos.
- Implementa Strategy para diferentes impuestos.
- Crea un Observer para un sistema de alertas.
- Implementa Command para un menú interactivo.
# Singleton config
class Config: pass
# Factory vehículos
def vehiculo(tipo): ...
8. Mini‑proyecto: Sistema modular con Strategy + Factory
class EstrategiaBase:
def ejecutar(self, x): raise NotImplementedError
class Doble(EstrategiaBase):
def ejecutar(self, x): return x * 2
class Triple(EstrategiaBase):
def ejecutar(self, x): return x * 3
def estrategia_factory(nombre):
if nombre == "doble": return Doble()
if nombre == "triple": return Triple()
class Motor:
def __init__(self, estrategia):
self.estrategia = estrategia
def procesar(self, x):
return self.estrategia.ejecutar(x)
m = Motor(estrategia_factory("triple"))
print(m.procesar(10))