Patrones de diseño en Python

Singleton Pattern in Python

Make sure a class has exactly one shared instance, such as one settings object or one connection pool.

  • Avanzado
  • 2 min de lectura
  • 1 ejemplo ejecutable
Lo que aprenderás
  • The problem Singleton solves
  • Implementing it with __new__
  • Simpler Python alternatives: modules
AppConfig() twice
  1. 1a = AppConfig()First call creates the instance
  2. 2b = AppConfig()Second call returns the stored one
  3. 3a is b → TrueSame object

Every call returns the same object

Singleton es un patrón de diseño (design pattern) que garantiza que una clase solo tenga un objeto en todo el programa, y que todo el código acceda a ese mismo objeto. Encaja con elementos que deben gestionarse de forma centralizada, como la configuración de la aplicación o la conexión a la base de datos.

Puntos clave

  1. The class keeps its one instance in a class attribute.
  2. __new__ creates it the first time and returns it every time after.
  3. Use it sparingly: global shared state makes testing harder.
  4. In Python a module-level object often does the same job.

¿Cuándo se usa?

  • Resolver problemas recurrentes de diseño de objetos con estructuras probadas.
  • Desacoplar responsabilidades para facilitar la extensión y las pruebas del código.
  • Usar un vocabulario de diseño común al hablar de arquitectura con el equipo.

Código de ejemplo

Ejecutar código →
main.py
class AppConfig:
    # Singleton: every caller receives one shared configuration object.
    _instance = None

    def __new__(cls):
        # Create the shared instance only on the first call.
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.theme = "dark"
        return cls._instance


first = AppConfig()
second = AppConfig()
print(first is second)
Obtén un botón Run para este ejemplo

Resultado de la ejecución

True

Explicación del código

El método __new__ se llama antes que __init__ cada vez que se crea un objeto. En la primera llamada, _instance todavía vale None, así que se crea el objeto y se guarda. En las llamadas siguientes, __new__ simplemente devuelve el objeto guardado, por eso al comparar los dos objetos con is se obtiene True.

Cambia los valores y ejecuta el programa en el compilador Python online de CodeUtility sin instalar Python.

Ejercicios de práctica

Prueba a modificar el código siguiendo las ideas de abajo. Cambiar el código y ver el resultado te ayudará a entender la lección mucho mejor que solo leerla.

  1. Sustituye el dominio del ejemplo conservando la estructura del patrón.
  2. Compara el patrón con una implementación más sencilla y explica las ventajas y desventajas.
  3. Escribe pruebas para cada participante antes de añadir otra implementación.
Ejecutar en el compilador de Python →

Practica con un reto

Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.

Todos los retos