IOKELU
Nivel: Avanzado – Guía 10
💡 Prueba el código:
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

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))

Siguiente guía

Metaprogramación en Python →