Introducción a la clase Singleton en Java

La clase Singleton restringe la creación de objetos para una clase a solo una en la máquina virtual java. También ayuda a proporcionar un punto de acceso global al objeto. Este patrón de diseño se usa comúnmente en el almacenamiento en caché, Abstract Factory, registro, prototipo, etc. También se usa en clases centrales de java como java.awt.Desktop, java.lang.Runtime. En java.lang.Runtime, Java proporciona una clase Runtime que significa el entorno de ejecución actual donde se ejecuta la aplicación. Esto ayuda en la interfaz de la aplicación y el entorno de tiempo de ejecución. Debe haber un objeto ya que el JRE es único. En java.awt.Desktop, class Desktop permite que las aplicaciones inicien un URI o un archivo con el navegador predeterminado del usuario, cliente de correo, etc. Aquí también, solo debe haber una instancia de la clase.

Cómo funciona la clase Singleton en Java

Singleton Class se puede crear de dos maneras.

  1. Establezca el constructor como privado para limitar la creación de un objeto.
  2. Cree un método estático para obtener una instancia del objeto, de modo que pueda manejar la creación del objeto solo dentro de la clase.

Ahora, veamos el diagrama Clase UML (Lenguaje Unificado de Modelado) de Clase Singleton.

En el diagrama Clase UML, la primera partición representa el nombre de una clase, la segunda partición representa los atributos y la tercera partición representa los métodos. Además, + indica atributos o métodos públicos e - indica atributos o métodos privados. En nuestro diagrama UML de clase Singleton, el nombre de la clase es Singleton y tiene un método principal. El método principal, el método getInstance y el sampleMethod son los únicos métodos que son públicos en el diagrama anterior. El atributo de constructor e instancia se establece como privado como parte de nuestra implementación. Este método Main público solicita la instancia y getInstance lo devuelve al método main.

Según la instanciación, la única diferencia entre la clase Java normal y la clase Singleton es que usaremos un constructor en la clase Java, mientras que en Singleton usaremos el método getInstance ().

El patrón de diseño Singleton tiene dos formas.

  • Instancia perezosa: creación de instancias cuando sea necesario
  • Creación de instancias temprana: creación de instancias en el momento de la carga.

1. Instanciación perezosa

En Lazy Instantiation, se crea una instancia de clase cuando se requiere. Se crea en el método o bloque Sincronizado para evitar las condiciones de carrera que pueden ocurrir en un entorno de subprocesos múltiples.

2. Instanciación temprana

En Early Instantiation, se crea una instancia en el momento de la carga. Aunque este es el enfoque más simple, tiene la desventaja de que la creación de la instancia es independiente de si se accede o no.

En la siguiente sección se explica un ejemplo de instanciación diferida e instanciación temprana.

Implementación de Singleton Class en Java

Como se discutió anteriormente, Singleton Class puede crearse en Early Instantiation o Lazy Instantiation.

Instanciación perezosa

Los siguientes son los pasos para implementar la instanciación diferida

1. Establecer Constructor como privado.

Por ejemplo, estamos creando una clase LazyClass. El constructor será como se muestra a continuación.

private LazyClass ()
(
)

2. Cree una instancia estática privada para la clase creada.

private static LazyClass instance;

3. Cree un método sincronizado estático que obtenga la instancia de clase creada.

public static synchronized LazyClass getInstance()
(
)

4. En el método getInstance (), primero, verifique si hay alguna instancia presente o no. Si no lo encuentra, cree uno. De lo contrario, devuelva la instancia.

if(instance == null)
(
instance = new LazyClass ();
)
return instance;

Ahora, analicémoslo usando un código de muestra.

//Java Program for Lazy Instantiation
public class LazyClass (
private static LazyClass instance;
//set the constructor as private
private LazyClass () ()
//Checks whether an instance is already in the getInstance method
public static synchronized LazyClass getInstance() (
//if instance is not present already, create a new one
if(instance == null) (
instance = new LazyClass ();
)
// if an instance is present, then return it
return instance;
)
//Sample method that is protected from more than one object creation
public void sampleMethod( ) (
System.out.println("sampleMethod for lazy singleton");
)
public static void main(String() args) (
LazyClass temp=LazyClass.getInstance();
temp.sampleMethod();
)
)

Salida:

Aquí, en lugar de crear una instancia en el momento de la carga, se crea dentro del bloque sincronizado. Para una mejor comprensión, también se proporciona un método de muestra que está protegido contra la creación de más de un objeto.

Instanciación temprana

Ahora veamos los pasos para la instanciación temprana. Es similar a la instanciación diferida, excepto que no utiliza ningún método o bloque sincronizado.

1. Establecer Constructor como privado.

Por ejemplo, estamos creando una clase EarlyClass. El constructor será como se muestra a continuación.

private EarlyClass () ()
(
)

2. Cree una instancia estática privada para la clase creada.

private static EarlyClass ins = new EarlyClass();

3. Cree un método estático que obtenga la instancia de clase creada.

public static EarlyClass getInstance()
(
)

El siguiente es el código de muestra para la instanciación temprana.

//Java Program for Early Instantiation
public class EarlyClass (
//Create an instance of the class at load time
private static EarlyClass ins = new EarlyClass();
//set the constructor as private
private EarlyClass () ()
//A static method to get the instance
public static EarlyClass getInstance() (
return ins ;
)
//A sample method that is protected from more than one object creation
public void sampleMethod() (
System. out .println("sampleMethod for Early singleton");
)
//Main method
public static void main(String() args) (
EarlyClass tmp = getInstance ();
tmp.sampleMethod();
)
)

Salida:

En el programa anterior, se crea una instancia en tiempo de carga y se devuelve utilizando el método getInstance (). Además, Constructor se configura como privado como parte de la instanciación singleton.

El ahorro de memoria es la principal ventaja de usar esto ya que un objeto se reutiliza y no se crea una y otra vez.

Conclusión

En este documento, hemos cubierto cómo funciona una clase Singleton con la ayuda del diagrama, el algoritmo y el código de muestra de la clase UML. Singleton Class se usa cuando solo necesitamos un objeto para una clase y un punto de acceso global a ese objeto. Las dos formas, como la creación de instancias tempranas y la creación de instancias perezosas, se pueden usar según el requisito.

Artículos recomendados

Esta es una guía de Singleton Class en Java. Aquí discutimos cómo funciona la clase singleton en Java junto con la implementación que incluye la creación de instancias perezosas y la creación de instancias tempranas. También puede consultar nuestros otros artículos sugeridos para obtener más información:

  1. ¿Qué es el patrón de diseño en Java?
  2. Clase abstracta en Java
  3. Anotaciones Java
  4. BorderLayout en Java
  5. JRE vs JVM | Las 8 principales diferencias con (infografía)
  6. ¿Cómo trabajar el método estático en JavaScript?