¿Qué son los Patrones de Diseño? Aplicación práctica y ejemplos en Odoo


Los patrones de diseño son soluciones reutilizables a problemas comunes que enfrentamos durante el desarrollo de software. No son fragmentos de código listos para copiar y pegar, sino estructuras que nos ayudan a construir soluciones más claras, flexibles y mantenibles.

En el ecosistema Python (y en particular en desarrollos sobre Odoo), aplicar estos patrones correctamente puede marcar la diferencia entre una aplicación frágil y una robusta.

¿Qué son los patrones de diseño?

Un patrón de diseño es una forma probada de organizar el código para resolver problemas típicos en programación orientada a objetos. Fueron popularizados por el libro Design Patterns: Elements of Reusable Object-Oriented Software (1994), escrito por el famoso "Gang of Four" (GoF): Erich Gamma, Richard Helm, Ralph Johnson y John Vlissides.

Estos patrones se clasifican en tres grandes categorías:

  • Creacionales: se enfocan en cómo se crean los objetos.
  • Estructurales: se centran en cómo se componen clases y objetos.
  • De comportamiento: se enfocan en cómo interactúan los objetos.

Ejemplo 1: Patrón Strategy

Permite seleccionar algoritmos en tiempo de ejecución sin modificar el código cliente.


class DiscountStrategy:
    def get_discount(self, total):
        return 0

class FestiveDiscount(DiscountStrategy):
    def get_discount(self, total):
        return total * 0.2

class LoyaltyDiscount(DiscountStrategy):
    def get_discount(self, total):
        return total * 0.1

class Order:
    def __init__(self, total, discount_strategy: DiscountStrategy):
        self.total = total
        self.discount_strategy = discount_strategy

    def final_price(self):
        return self.total - self.discount_strategy.get_discount(self.total)

# Uso
order = Order(100, FestiveDiscount())
print(order.final_price())  # 80.0


🟢 En Odoo: Podrías usar esto para calcular descuentos en ventas, dependiendo del tipo de cliente o época del año.

Ejemplo 2: Patrón Singleton


class ConfigSingleton:
    _instance = None

    def __new__(cls, config=None):
        if cls._instance is None:
            cls._instance = super(ConfigSingleton, cls).__new__(cls)
            cls._instance.config = config
        return cls._instance

# Uso
config1 = ConfigSingleton({'api_key': '123'})
config2 = ConfigSingleton()
print(config1 is config2)  # True

Asegura que una clase tenga una única instancia global.


🟢 En Odoo: Se puede usar en servicios únicos como acceso a configuraciones de una API externa.

Ejemplo 3: Patrón Decorator

Permite añadir funcionalidades adicionales a un objeto sin alterar su estructura.


def log_execution(func):
    def wrapper(*args, **kwargs):
        print(f"Llamando a {func.__name__}")
        return func(*args, **kwargs)
    return wrapper

@log_execution
def process_invoice():
    print("Procesando factura...")

process_invoice()



🟢 En Odoo: Se puede usar para extender funciones de modelos sin sobrescribir completamente create, write, etc.

¿Cómo aplicamos estos patrones en Odoo?

Odoo es una plataforma modular basada en Python. Aunque no se impone un patrón rígido, combinar la arquitectura de Odoo con patrones clásicos mejora la calidad del código:

  • Al implementar múltiples formas de crear objetos (Factory)
  • En servicios reutilizables (Singleton, Facade)
  • Para extender funcionalidades sin duplicar código (Decorator)
  • O al organizar reglas o comportamientos personalizados (Strategy, Template Method)

Estos patrones también son muy útiles al trabajar con microservicios, servicios externos, tareas agendadas o integración de módulos personalizados.

Resumen de Patrones de Diseño y su Aplicación en Odoo

Patrón Tipo ¿Para qué sirve? Aplicación en Odoo
Strategy Comportamiento Encapsular algoritmos intercambiables Diferentes reglas para calcular descuentos o impuestos
Singleton Creacional Garantizar una única instancia Servicio global de configuración, logging, o acceso a APIs externas
Decorator Estructural Añadir funcionalidades sin modificar la clase original Extender comportamiento de modelos o reportes dinámicamente
Observer Comportamiento Notificar múltiples objetos sobre un cambio de estado Reaccionar a cambios de estado (e.g. notificar usuarios al validar una factura)
Factory Method Creacional Delegar la creación de objetos a subclases Crear diferentes tipos de documentos electrónicos (factura, nota, retención)
Adapter Estructural Convertir la interfaz de una clase en otra esperada Integrar una API externa con formato diferente al esperado por Odoo
Facade Estructural Proveer una interfaz unificada a un conjunto de subsistemas Crear una clase de servicio para simplificar llamadas a múltiples modelos (por ejemplo, facturación masiva)
Command Comportamiento Encapsular una solicitud como objeto Implementar operaciones reversibles o programar tareas (e.g. agendar pagos automáticos)
Template Method Comportamiento Definir un esqueleto de algoritmo y dejar detalles a subclases Procesos que comparten pasos comunes como validación, ejecución y notificación

Conclusión

Los patrones de diseño no son solo teoría, son herramientas reales que puedes aplicar para hacer tus desarrollos en Odoo más robustos, organizados y escalables. Entender y aplicar estos patrones en Python te convertirá en un desarrollador más completo y profesional.



¿Qué son los Patrones de Diseño? Aplicación práctica y ejemplos en Odoo
Lester Chacón Medina 3 de mayo de 2025
Compartir esta publicación
Etiquetas
Iniciar sesión para dejar un comentario
Microservicios con Python: Qué son, para qué se utilizan y cómo integrarlos con Odoo