El patr贸n de dise帽o Singleton en Python

    Introducci贸n

    En este art铆culo, nos sumergiremos en el patr贸n de dise帽o Singleton, implementado en Python.

    A medida que pasa el tiempo, el software se adapta m谩s a la resoluci贸n de problemas espec铆ficos en diferentes dominios. Si bien existen muchas diferencias en el nivel de aplicaci贸n de nuestro software, algunos aspectos del dise帽o del software siguen siendo b谩sicamente los mismos. Es posible que estos aspectos no sigan siendo los mismos para todo el software que existe, pero ser谩n v谩lidos para muchos escenarios. Por lo tanto, aprenderlos y comprenderlos ser谩 muy beneficioso para ayudarnos a crear programas resilientes.

    Esta es la primera de una serie sobre patrones de dise帽o en Python y los diferentes patrones que podemos utilizar para crear software.

    驴Qu茅 es un patr贸n de dise帽o?

    Un patr贸n de dise帽o es un enfoque particular para resolver un problema recurrente en el desarrollo de software y tambi茅n se utiliza para representar buenas pr谩cticas. No es un c贸digo real, pero representa una forma particular de organizar el c贸digo para producir la soluci贸n deseada de la manera recomendada. Esto significa que no tenemos que seguir estrictamente los patrones de dise帽o establecidos para todo nuestro c贸digo, sino analizar nuestras necesidades y aplicar el patr贸n de dise帽o m谩s adecuado para nuestras necesidades.

    Los patrones de dise帽o surgen de una gran experiencia en la resoluci贸n de problemas en el desarrollo de software y se prueban y prueban para adaptarse a escenarios particulares. Otra raz贸n para aprender sobre los patrones de dise帽o es que, si bien un patr贸n puede no funcionar para un escenario en particular, puede ofrecer una base desde la cual se puede formular una soluci贸n.

    Sin embargo, a pesar de que los patrones de dise帽o pueden ayudarnos a salir de varias situaciones, es importante evaluar la situaci贸n actual y explorar todas las opciones disponibles antes de saltar directamente a un patr贸n porque puede haber una soluci贸n mejor.

    Los patrones de dise帽o se dividen en unas pocas categor铆as amplias, aunque principalmente patrones de creaci贸n, patrones estructurales y patrones de comportamiento.

    Patrones de creaci贸n

    Hay varios aspectos de los patrones de dise帽o que los distinguen entre s铆, incluida la complejidad del patr贸n de dise帽o, el nivel de aplicaci贸n dentro de un sistema y la cantidad de detalles.

    Los patrones de creaci贸n incluyen aquellos que definen formas de crear objetos que contribuyen a una mayor flexibilidad y reutilizaci贸n del c贸digo en toda la aplicaci贸n.

    Los ejemplos de patrones de creaci贸n incluyen el patr贸n Singleton, el m茅todo de f谩brica, los patrones de f谩brica abstracta, constructor y prototipo.

    El patr贸n singleton

    Definici贸n

    El patr贸n singleton es un patr贸n de creaci贸n com煤n que se utiliza para definir la creaci贸n de una 煤nica instancia de una clase al tiempo que proporciona un 煤nico punto de acceso global a ese objeto.

    Este patr贸n restringe la cantidad de objetos que se pueden crear a partir de una clase a un solo objeto que a menudo se compartir谩 globalmente en una aplicaci贸n.

    Motivaci贸n

    Este patr贸n se implementa com煤nmente en funciones que requieren control sobre el acceso a un recurso compartido, como una conexi贸n de base de datos o un archivo. Al garantizar que una clase solo se pueda usar para crear una 煤nica instancia y proporcionar un 煤nico punto de acceso global, el acceso al recurso compartido se puede restringir y se puede mantener la integridad.

    La creaci贸n de instancias 煤nicas tambi茅n ayuda a garantizar que algunos aspectos de nuestros programas no puedan ser sobrescritos por otras clases, lo que da como resultado un c贸digo inseguro o ineficiente. Esto tambi茅n nos permite acceder al mismo objeto en m煤ltiples puntos de nuestros programas sin el temor de que pueda sobrescribirse en alg煤n momento de nuestro programa.

    Por ejemplo, las conexiones a la base de datos se realizan una vez en nuestros programas, y el mismo objeto se utiliza para realizar operaciones en nuestra base de datos en toda la aplicaci贸n. Si diferentes partes de nuestra aplicaci贸n pudieran crear sus propias conexiones de base de datos, pueden surgir problemas de integridad con el tiempo, ya que cada parte intenta acceder a la base de datos por su cuenta.

    Implementaci贸n

    El patr贸n Singleton requiere que la instanciaci贸n de una clase est茅 restringida a un solo objeto. El control de la creaci贸n de objetos se logra mediante la implementaci贸n de un m茅todo de creaci贸n que guarda el objeto creado en un campo est谩tico.

    Todas las llamadas a este m茅todo de creaci贸n devuelven el objeto singleton original o un error que indica la existencia de un objeto instanciado. Esto evita la creaci贸n de m谩s de un objeto para nuestra clase y mantiene la propiedad singleton.

    Una buena analog铆a de un patr贸n 煤nico es que un pa铆s puede tener un solo gobierno que controle el acceso y las operaciones dentro del pa铆s. Est谩 prohibido cualquier intento de crear otro gobierno.

    Podemos implementar esta analog铆a de gobierno en una clase singleton de la siguiente manera en Python:

    class SingletonGovt:
       __instance__ = None
    
       def __init__(self):
           """ Constructor.
           """
           if SingletonGovt.__instance__ is None:
               SingletonGovt.__instance__ = self
           else:
               raise Exception("You cannot create another SingletonGovt class")
    
       @staticmethod
       def get_instance():
           """ Static method to fetch the current instance.
           """
           if not SingletonGovt.__instance__:
               SingletonGovt()
           return SingletonGovt.__instance__
    

    En nuestro ejemplo, definimos la variable que contendr谩 el objeto 煤nico que se instanciar谩. Nuestro constructor verifica si hay una clase existente y genera un error.

    Al buscar el objeto con el get_instance() , comprobamos si una instancia existente est谩 disponible y la devolvemos. Si no, creamos uno y lo devolvemos.

    Nuestra SingletonGovt en acci贸n:

    government = SingletonGovt()
    print(government)
    
    same_government = SingletonGovt.get_instance()
    print(same_government)
    
    another_government = SingletonGovt.get_instance()
    print(another_government)
    
    new_government = SingletonGovt()
    print(new_government)
    

    Cuando ejecutamos nuestro script, podemos ver que solo tenemos uno SingletonGovt instancia almacenada en un solo punto en la memoria. Cualquier intento de crear otro gobierno se ve frustrado por la excepci贸n que planteamos:

    Pros y contras

    Pros

    • El patr贸n Singleton ofrece la garant铆a de que solo existe una instancia de nuestra clase y reduce el riesgo de comportamiento inesperado en nuestro programa.
    • Dado que la creaci贸n de la clase est谩 controlada por una sola clase, esto ofrece flexibilidad, ya que solo es necesario realizar cambios en una clase y un objeto.

    Contras

    • Una clase creada con el patr贸n singleton viola la Principio de responsabilidad 煤nica ya que la clase puede tener que manejar m谩s de una responsabilidad en un momento dado.
    • La gesti贸n del ciclo de vida puede plantear problemas en otras 谩reas, como las pruebas, ya que la clase singleton se mantiene viva durante la vida 煤til de la aplicaci贸n y diferentes casos de prueba pueden requerir nuevas versiones de la clase.

    Conclusi贸n

    En esta publicaci贸n, hemos presentado, discutido e implementado el patr贸n de dise帽o Singleton.

    Al igual que cualquier otro patr贸n de dise帽o, tiene sus pros y sus contras y, si bien puede ser adecuado para algunas situaciones, es posible que no se aplique a todas nuestras necesidades de desarrollo. Por lo tanto, depende de nosotros analizar el problema en cuesti贸n y tomar la decisi贸n de si el patr贸n singleton facilitar谩 o no nuestro trabajo.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *