El patron de diseño singleton


Muchos problemas de rendimiento y de escalabilidad suceden cuando se utilizan las conexiones a las bases de datos. Hay que tener en cuenta que las conexiones son un recurso que consume memoria y tiempo de procesador, por lo que sólo se deben crear las conexiones necesarias y estas deben cerrarse tan pronto como se a posible.

Una buena práctica es que todas las clases accedan a los recursos de la base de datos usando siempre una única conexión sin importar el número de instancias que estas clases generen al ser ejecutadas en una aplicación.

El patrón Singleton (instancia única) es el más sencillos, conocidos y utilizados. Está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto, asegurando de que sólo exista una única instancia de la clase sin importar el número de veces que se intente crear y proporcionando un punto de acceso global.

Se podría suponer que utilizando miembros estáticos obtendríamos el mismo resultado, pero no es así, ya que en este caso la responsabilidad de tener una única instancia recae en el cliente de la clase.

El patrón Singleton hace que la clase sea responsable de su única instancia y se implementa creando en nuestra clase un método para la creación de la instancia del objeto sólo si todavía no existe alguna. Para asegurar que la clase no puede ser instanciada nuevamente se regula el alcance del constructor (con atributos como protegido o privado).

Resumiendo, el patrón Singleton, provee una única instancia global ya que:
  • La propia clase es responsable de crear la única instancia.
  • Permite el acceso global a dicha instancia mediante un método de clase.
  • Declara el constructor de clase como privado para que no sea instanciable directamente.
El diseño clásico de un es el siguiente:

Analizando la clase se puede observar el uso de los modificadores "private" y "static" en el constructor que hacen que no se pueda crear la clase de forma directa, sino a través del método public GetInstance() que devuelve la instancia creada.

A continuación voy a mostrar un ejemplo en c# en el que tendremos dos clases, que al crearse se guardan la fecha y hora de creación:
  • "Instancia1", en la que no se utiliza el patrón Singleton
  • "Instancia2" en la que implementaremos el patrón Singleton.
    Para utilizar esta clase se deberá invocar mediante el método "GetInstance()".
Aquí les dejo el pantallazo del programa en el que se utilizan ambas clases, es muy básico con la opción "a" se crea una instancia de la clase que no tiene implementado el patrón Singleton y con la opción "b" se crea la instancia con el patrón implementado y estas instancias se guardan en una lista para mostrarlas.


Como se puede observar cada vez que se crea una instancia sin el patrón Singleton obtenemos una fecha y hora diferente, es decir, son instancias diferentes que se crean en cada llamada. En cambio, utilizando el patrón Singleton obtenemos la misma fecha y hora, ya que se crea una sola instancia de acceso global.

Si quieren ver el código fuente completo, aquí les dejo el código.

1 comentario:

Nota: solo los miembros de este blog pueden publicar comentarios.