Java - Come utilizzare la classe Singleton?

Lo scopo di Singleton è controllare la creazione di oggetti, limitando il numero di oggetti a uno solo. Poiché esiste una sola istanza Singleton, tutti i campi di istanza di un Singleton si verificheranno solo una volta per classe, proprio come i campi statici. I singleton spesso controllano l'accesso alle risorse, come le connessioni al database oi socket.

Ad esempio, se si dispone di una licenza per una sola connessione per il database o il driver JDBC ha problemi con il multithreading, Singleton si assicura che venga effettuata una sola connessione o che solo un thread alla volta possa accedere alla connessione.

Implementazione di singleton

Esempio 1

L'implementazione più semplice consiste in un costruttore privato e un campo per conservare il risultato e un metodo di accesso statico con un nome come getInstance ().

Il campo privato può essere assegnato dall'interno di un blocco inizializzatore statico o, più semplicemente, utilizzando un inizializzatore. Il metodo getInstance () (che deve essere pubblico) quindi restituisce semplicemente questa istanza -

// 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");
   }
}

Ecco il file di programma principale in cui creeremo un oggetto singleton -

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

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

Questo produrrà il seguente risultato:

Produzione

demoMethod for singleton

Esempio 2

La seguente implementazione mostra un classico modello di progettazione 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 classe ClassicSingleton mantiene un riferimento statico all'istanza singleton solitaria e restituisce quel riferimento dal metodo statico getInstance ().

Qui, la classe ClassicSingleton utilizza una tecnica nota come istanziazione lazy per creare il singleton; di conseguenza, l'istanza singleton non viene creata finché il metodo getInstance () non viene chiamato per la prima volta. Questa tecnica garantisce che le istanze singleton vengano create solo quando necessario.