Java - ¿Cómo utilizar la clase Singleton?

El propósito de Singleton es controlar la creación de objetos, limitando el número de objetos a solo uno. Dado que solo hay una instancia de Singleton, cualquier campo de instancia de Singleton se producirá solo una vez por clase, al igual que los campos estáticos. Los singletons a menudo controlan el acceso a los recursos, como conexiones de bases de datos o sockets.

Por ejemplo, si tiene una licencia para una sola conexión para su base de datos o su controlador JDBC tiene problemas con el subproceso múltiple, Singleton se asegura de que solo se realice una conexión o que solo un subproceso pueda acceder a la conexión a la vez.

Implementación de Singletons

Ejemplo 1

La implementación más sencilla consiste en un constructor privado y un campo para contener su resultado, y un método de acceso estático con un nombre como getInstance ().

El campo privado se puede asignar desde dentro de un bloque inicializador estático o, más simplemente, mediante un inicializador. El método getInstance () (que debe ser público) simplemente devuelve esta instancia -

// File Name: Singleton.java
public class Singleton {

   private static Singleton singleton = new Singleton( );

   /* A private Constructor prevents any other
    * class from instantiating.
    */
   private Singleton() { }

   /* Static 'instance' method */
   public static Singleton getInstance( ) {
      return singleton;
   }

   /* Other methods protected by singleton-ness */
   protected static void demoMethod( ) {
      System.out.println("demoMethod for singleton");
   }
}

Aquí está el archivo del programa principal donde crearemos un objeto singleton:

// File Name: SingletonDemo.java
public class SingletonDemo {

   public static void main(String[] args) {
      Singleton tmp = Singleton.getInstance( );
      tmp.demoMethod( );
   }
}

Esto producirá el siguiente resultado:

Salida

demoMethod for singleton

Ejemplo 2

La siguiente implementación muestra un patrón de diseño clásico de Singleton:

public class ClassicSingleton {

   private static ClassicSingleton instance = null;
   private ClassicSingleton() {
      // Exists only to defeat instantiation.
   }

   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}

La clase ClassicSingleton mantiene una referencia estática a la instancia única de singleton y devuelve esa referencia del método estático getInstance ().

Aquí, la clase ClassicSingleton emplea una técnica conocida como instanciación perezosa para crear el singleton; como resultado, la instancia de singleton no se crea hasta que se llama al método getInstance () por primera vez. Esta técnica garantiza que las instancias de singleton se creen solo cuando sea necesario.