Patrón de diseño de software: Singleton

Publicado por
Dentro de la ingeniería de software existen diversos patrones de diseño, enfocados en proporcionar la solución a específicos problemas de diseño, en esta nota aprenderemos sobre uno en particular, el singleton.

¿Qué es un singleton?

Es un patrón de diseño utilizado dentro de la programación orientada a objetos que, como su nombre lo sugiere, del inglés single” que significa único”, trata de diseñar clases que solo puedan ser instadas una vez, es decir, que de esa clase, durante toda la ejecución del programa, unicamente podrá ser creado un objeto. El singleton es útil, por ejemplo, cuando una clase es diseñada para representar un dispositivo único dentro de un programa: el teclado o el ratón por mencionar algunos, también es requerido en diseños de clases que interactúan con todas las demás como un recurso común, algo así como una clase de ámbito global. 

¿Cómo funciona el singleton?

Para diseñar una clase singleton hay algunos puntos importantes a tomar en cuenta:
  • Asegurar la creación de un único objeto

Ya que el propósito de una clase singleton es que solo se pueda crear un único objeto  de ella, el mecanismo de creación de objetos debe ser modificado de tal manera que se utilice solo una vez el constructor, pero ¿cómo logramos esto? la manera correcta es dejar que la clase misma controle su propio constructor y que ninguna otra entidad pueda tener acceso a este, en otras palabras, habrá que declarar el constructor como privado y programar lo necesario para que este solo sea usado una vez en todo el programa.

  • Acceso al único objeto

Una vez contemplado el problema del único objeto surge otra incógnita ¿cómo usar ese objeto? el truco está en proporcionar una interfaz desde la clase para que las demás entidades puedan interactuar con este objeto. Esto se puede lograr definiendo un método de clase que además sea público, un método con estas características puede ser llamado desde fuera de la clase sin necesidad de haber creado un objeto de la misma.

  • ¿Cómo se crea el objeto dentro de la clase?

Ya que nos aseguramos de que la clase controla el constructor y que además proporciona una interfaz para interactuar con su único objeto, resta pensar en cómo existe y se maneja esta instancia dentro de la clase. La respuesta recae en usar una referencia o un apuntador, la variable que al final contendrá la memoria que representa al objeto, esta referencia debe tener las siguientes características:

    • Ser un atributo perteneciente a la clase, no a los objetos de dicha clase: esto es necesario porque, al no tener un objeto inicialmente, se requiere usar un atributo accesible desde la clase. 
    • Ser visible únicamente dentro de la clase, aunque esta es una característica fundamental de la POO, no está de más recordar que hay que aplicar encapsulamiento para proteger los atributos de una clase.

Resuelto lo anterior solo queda discutir sobre la tan mencionada interfaz con el exterior y el uso interno del constructor. Para empezar, dicha interfaz será usada por las entidades que quieran interactuar con el singleton, entonces cada vez que se llame a este método, dentro de la clase se deberá acceder al objeto; aquí nos encontramos con dos posibilidades:

    • El objeto aún no es creado y debe ser construido y guardado en el atributo de referencia para finalmente retornar esa referencia, esta será la primera y última vez que se utiliza el constructor.
    • El objeto ya existe y simplemente basta con retornar la referencia existente.

Conclusión

En esta nota aprendimos qué es un singleton y cómo funciona, además discutimos los puntos importantes de su diseño. Como la teoría no es suficiente, en la siguiente entrega aplicaremos lo expuesto hoy para escribir una clase singleton usando C++ y ver este patrón de diseño en acción.

2 comments

  1. Me encantó la información y la manera en la que lo han explicado; hay algo que se llama microservicios, espero encontrar un artículo acerca de ello sería muy bueno. Sigan así, este es un excelente trabajo.

Deja una respuesta

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