En la programación orientada a objetos, una clase singleton de Java es una clase que sólo puede tener un objeto (una instancia de la clase) a la vez. Después de la primera vez, si intentamos crear una instancia de las clases Java Singleton, la nueva variable también apunta a la primera instancia creada. Entonces, cualquier modificación que hagamos a cualquier variable dentro de la clase a través de cualquier instancia, afecta la variable de la instancia única creada y es visible si accedemos a esa variable a través de cualquier variable de ese tipo de clase definida.
Recuerde los puntos clave al definir una clase como clase singleton, es decir, al diseñar una clase singleton:
- Hacer que un constructor sea privado.
- Escriba un método estático que tenga el objeto de tipo de retorno de esta clase singleton. Aquí, se utiliza el concepto de inicialización diferida para escribir este método estático.
Propósito de la clase Singleton
El objetivo principal de una clase Java Singleton es restringir el límite del número de creaciones de objetos a una sola. Esto a menudo garantiza que haya control de acceso a los recursos, por ejemplo, conexión de socket o base de datos.
El desperdicio de espacio de memoria no ocurre con el uso de la clase singleton porque restringe la creación de instancias. Ya que la creación del objeto se realizará solo una vez en lugar de crearlo cada vez que se realice una nueva solicitud.
Podemos utilizar este único objeto repetidamente según los requisitos. Esta es la razón por la que las aplicaciones de bases de datos y subprocesos múltiples utilizan principalmente el patrón Singleton en Java para el almacenamiento en caché, el registro, la agrupación de subprocesos, los ajustes de configuración y mucho más.
Por ejemplo, tenemos una licencia y solo tenemos una conexión de base de datos o suponemos que nuestro controlador JDBC no nos permite realizar subprocesos múltiples, entonces la clase Singleton entra en escena y se asegura de que a la vez solo haya una conexión. o un solo hilo puede acceder a la conexión.
¿Cómo diseñar/crear una clase Singleton en Java?
Para crear una clase singleton, debemos seguir los pasos que se detallan a continuación:
1. Asegúrese de que solo exista una instancia de la clase.
2. Proporcionar acceso global a esa instancia mediante
- Declarar que todos los constructores de la clase son privados.
- Proporcionar un método estático que devuelve una referencia a la instancia. El concepto de inicialización diferida se utiliza para escribir métodos estáticos.
- La instancia se almacena como una variable estática privada.
Un ejemplo de clases singleton es Clase de tiempo de ejecución, servlet de acción y localizador de servicios . Los constructores privados y los métodos de fábrica también son un ejemplo de clase singleton.
Diferencia entre clase normal y clase singleton
Podemos distinguir una clase Singleton de las clases habituales con respecto al proceso de creación de instancias del objeto de la clase. Para crear una instancia de una clase normal, utilizamos un constructor de Java. Por otro lado, para crear una instancia de una clase singleton, utilizamos el método getInstance().
La otra diferencia es que una clase normal desaparece al final del ciclo de vida de la aplicación, mientras que la clase singleton no se destruye al finalizar una aplicación.
Formas de patrón de clase Singleton
Hay dos formas de patrones de diseño singleton, que son:
- Creación de instancias tempranas: La creación del objeto tiene lugar en el momento de la carga.
- Creación de instancias diferidas: La creación del objeto se realiza según el requisito.
Implementación: Veamos brevemente cómo varía la clase singleton de la clase normal en Java. Aquí la diferencia está en términos de creación de instancias, ya que para la clase normal usamos un constructor, mientras que para la clase singleton usamos el método getInstance() que veremos en el ejemplo 1, como se muestra a continuación. En general, para evitar confusiones, también podemos usar el nombre de la clase como nombre del método al definir este método, que se representará en el ejemplo 2 a continuación.
Ejemplo 1:
Java
// Java program implementing Singleton class> // with using getInstance() method> // Class 1> // Helper class> class> Singleton {> >// Static variable reference of single_instance> >// of type Singleton> >private> static> Singleton single_instance =>null>;> >// Declaring a variable of type String> >public> String s;> >// Constructor> >// Here we will be creating private constructor> >// restricted to this class itself> >private> Singleton()> >{> >s =>'Hello I am a string part of Singleton class'>;> >}> >// Static method> >// Static method to create instance of Singleton class> >public> static> synchronized> Singleton getInstance()> >{> >if> (single_instance ==>null>)> >single_instance =>new> Singleton();> >return> single_instance;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Instantiating Singleton class with variable x> >Singleton x = Singleton.getInstance();> >// Instantiating Singleton class with variable y> >Singleton y = Singleton.getInstance();> >// Instantiating Singleton class with variable z> >Singleton z = Singleton.getInstance();> >// Printing the hash code for above variable as> >// declared> >System.out.println(>'Hashcode of x is '> >+ x.hashCode());> >System.out.println(>'Hashcode of y is '> >+ y.hashCode());> >System.out.println(>'Hashcode of z is '> >+ z.hashCode());> >// Condition check> >if> (x == y && y == z) {> >// Print statement> >System.out.println(> >'Three objects point to the same memory location on the heap i.e, to the same object'>);> >}> >else> {> >// Print statement> >System.out.println(> >'Three objects DO NOT point to the same memory location on the heap'>);> >}> >}> }> |
lista de matrices ordenada java
>
>Producción
Hashcode of x is 558638686 Hashcode of y is 558638686 Hashcode of z is 558638686 Three objects point to the same memory location on the heap i.e, to the same object>
Explicación de salida:

En una clase singleton, cuando llamamos por primera vez al método getInstance() , crea un objeto de la clase con el nombre single_instance y lo devuelve a la variable. Dado que single_instance es estático, se cambia de nulo a algún objeto. La próxima vez, si intentamos llamar al método getInstance() ya que single_instance no es nulo, se devuelve a la variable, en lugar de crear una instancia de la clase Singleton nuevamente. Esta parte se realiza mediante la condición if.
En la clase principal, creamos una instancia de la clase singleton con 3 objetos x, y y z llamando al método estático método getInstancia() . Pero en realidad, después de la creación del objeto x, las variables y y z apuntan al objeto x como se muestra en el diagrama. Por lo tanto, si cambiamos las variables del objeto x, eso se refleja cuando accedemos a las variables de los objetos y y z. Además si cambiamos las variables del objeto z, eso se refleja cuando accedemos a las variables de los objetos x e y.
cambiar el nombre del directorio en Linux
Ahora que hemos terminado de cubrir todos los aspectos del ejemplo 1 y hemos implementado lo mismo, ahora implementaremos la clase Singleton con el nombre del método como el nombre de la clase.
Ejemplo 2:
Java
// Java program implementing Singleton class> // with method name as that of class> // Class 1> // Helper class> class> Singleton {> >// Static variable single_instance of type Singleton> >private> static> Singleton single_instance =>null>;> >// Declaring a variable of type String> >public> String s;> >// Constructor of this class> >// Here private constructor is used to> >// restricted to this class itself> >private> Singleton()> >{> >s =>'Hello I am a string part of Singleton class'>;> >}> >// Method> >// Static method to create instance of Singleton class> >public> static> Singleton Singleton()> >{> >// To ensure only one instance is created> >if> (single_instance ==>null>) {> >single_instance =>new> Singleton();> >}> >return> single_instance;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Instantiating Singleton class with variable x> >Singleton x = Singleton.Singleton();> >// Instantiating Singleton class with variable y> >Singleton y = Singleton.Singleton();> >// instantiating Singleton class with variable z> >Singleton z = Singleton.Singleton();> >// Now changing variable of instance x> >// via toUpperCase() method> >x.s = (x.s).toUpperCase();> >// Print and display commands> >System.out.println(>'String from x is '> + x.s);> >System.out.println(>'String from y is '> + y.s);> >System.out.println(>'String from z is '> + z.s);> >System.out.println(>'
'>);> >// Now again changing variable of instance z> >z.s = (z.s).toLowerCase();> >System.out.println(>'String from x is '> + x.s);> >System.out.println(>'String from y is '> + y.s);> >System.out.println(>'String from z is '> + z.s);> >}> }> |
>
>Producción
String from x is HELLO I AM A STRING PART OF SINGLETON CLASS String from y is HELLO I AM A STRING PART OF SINGLETON CLASS String from z is HELLO I AM A STRING PART OF SINGLETON CLASS String from x is hello i am a string part of singleton class String from y is hello i am a string part of singleton class String from z is hello i am a string part of singleton class>
Explicación: En la clase singleton, cuando llamamos por primera vez al método Singleton(), crea un objeto de clase Singleton con el nombre single_instance y lo devuelve a la variable. Dado que single_instance es estático, se cambia de nulo a algún objeto. La próxima vez, si intentamos llamar al método Singleton(), dado que single_instance no es nulo, se devuelve a la variable, en lugar de crear una instancia de la clase Singleton nuevamente.
Lectura adicional: Tutorial de patrones de diseño de Java