El patrón Singleton

    El singletón es un patrón de diseño que significa "instancia única". Se utiliza para restringir la creación de objetos pertenecientes a una clase (la que será nuestro Singletón) o el valor de un tipo a un único objeto.
   El objetivo principal es asegurar que la clase no pueda ser instanciada más de una única vez, es decir, garantizar que la clase sólo tenga una instancia y proporcionar un punto de acceso global a ella.
    Las situaciones más habituales de aplicación de este patrón son aquellas en las que dicha clase controla el acceso a un recurso físico único (como puede ser el ratón o un archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible para todos los demás objetos de la aplicación.
    Para crear una clase singletón, primero tenemos que pensar en el objetivo principal del mismo, o sea que solo permita crear una única instancia de la misma. Para solucionar esto, vamos a dividirlo en dos pasos:
1 - Como sabemos, la manera de crear una instancia de una clase es a través de su constructor, por ende, si el constructor de la clase es privado, ninguna otra clase tendrá acceso al mimo, por lo cual no van a poder crear instancias del mismo. Con esto tenemos solucionado que no se creen instancias de esa clase. Sin embargo, QUEREMOS crear UNA, pasemos al siguiente paso.
2 - Una vez que nuestro constructor es privado, ninguna clase externa tiene acceso al mismo, pero sí la misma clase que lo contiene, por ende, podemos crear instancias de nuestra clase desde la misma. Si escribimos un método PUBLICO que retorne una instancia de la clase, dicho método podría ser accedido desde afuera para crear instancias de la misma. El problema es nuevamente que podemos llamar tantas veces al método como queramos y con esto nuevamente vamos a poder crear muchas instancias de la clase. La solución final radica en colocar un condicional dentro del método que pregunte si ya está creada la instancia (a través de una variable), entonces retornar simplemente la misma, de lo contrario crearla por primera vez y retornarla.

Ejemplo:

public class Singleton{
   
     //creamos la variable por la cual preguntaremos en el método si es nula o no.
     private static Singleton singleton;

     //creamos nuestro constructor privado
     private Singleton(){}

     //finalmente nuestro método para retornar la instancia del Singletón
      public static Singleton getSingleton(){
          //Preguntamos si el singletón ya fue inicializado
          if(singleton==null) {
                  singleton = new  Singleton();
         }
         return singleton;
       }

}


Desde una clase externa para obtener la instancia de esa clase Singletón simplemente basta con hacer:

Singletón singletón = Singletón.getSingletón();

Es decir, acceder al método público que nos brinda la clase Singletón.

La instrumentación del patrón puede ser delicada en programas con múltiples hilos de ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo y esta no existe todavía, sólo uno de ellos debe lograr crear el objeto. La solución clásica para este problema es utilizar exclusión mutua en el método de creación de la clase que implementa el patrón.

Como conclusión:
El patrón singleton provee una única instancia global gracias a 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.


Saludos.


No comments:

Post a Comment