Il pattern Singleton

Creare un’unica istanza di una classe con il pattern Singleton

Il pattern Singleton, in italiano singoletto, rappresenta un problema ricorrente nella programmazione. Il Singleton si utilizza quando si vuole che una classe abbia un’unica istanza (oggetto). Questo pattern è di tipo creazionale, ne abbiamo già trattato questo pattern nella guida base di java, adesso ne approfondiremo il discorso.
In genere, quando si scrive una classe il suo costruttore viene dichiarato public in modo da poterla istanziare. Avendo un costruttore pubblico un metodo è in grado generare “infinite” istanze di quella classe, per questo motivo il Singleton assicura al programmatore che della classe voluta esisterà sempre e solo un’unica istanza.

Graficamente il pattern Singleton è così definito:

Il pattern Singleton

Sono svariati gli esempi d’uso del pattern Singleton, ad esempio una classe che gestisce uno Spooler di stampa o qualunque altro oggetto che deve gestire una risorsa del sistema.
Per poter implementare questo pattern occorre definire una classe in cui è possibile l’istanziazione di un unico oggetto, definendo il costruttore privato e dotando al classe di un metodo getInstance(). Quest’ultimo metodo deve creare un’istanza della classe se non esiste, altrimenti deve restituire un riferimento all’oggetto della classe già esistente.

Un’implementazione tipica del pattern Singleton è la seguente:

  public static class Singleton {

    // Variabile privata con il riferimento all'unica istanza della classe
    private static Singleton instance = null;

    // Costruttore privato
    private Singleton() {
      // ...
    }

    // Metodo pubblico che si fa carico dell'istanziazione della classe
    public static Singleton instance() {
      if(instance == null) {
        instance = new Singleton(); // La classe non era mai stata creata
      }
      return instance;
    }

  }

Possiamo schematizzare i passi del pattern Singleton in 3 passi:

  1. Definire una variabile privata che conterrà l’unico riferimento della classe;
  2. Scrivere un costruttore privato che crea la classe;
  3. Definire un metodo getInstance che restituisce l’unico riferimento esistente della classe. Se la classe non esiste crea un nuovo oggetto.

Metodi alternativi per l’uso del pattern Singleton

Una soluzione alternativa per realizzare il Singleton è tramite una classe statica (Booch utility), in questo caso avremo solo un’istanza della classe essendo per l’appunto statica:

  public static class TestBooch {
    private TestBooch() {
      // ...
    }
    public static void print (String args{}) {
      // ...
    }
  }

Anche in questo caso viene definito un costruttore privato per non rendere consentire di creare direttamente una nuova istanza della classe.

Questa versione di Singleton prende il nome di Booch utility, perché è stato Grady Booch per primo ad identificarlo. Lo svantaggio di questo metodo è quello che non è possibile istanziare la classe per poter reperire informazioni a run time (dato che le classi statiche vengono istanziate a tempo di caricamento). Inoltre, con il Booch Utility non è possibile far implementare interfacce alla classe.

Un ultima versione del pattern Singleton è la sua versione multithread, per evitare che vengano create più istanze della stesa classe bisogna dichiarare il metodo getInstance synchronized. Riprendo il primo esempio di Singleton avremo:

  public static class Singleton {

    // Variabile privata con il riferimento all'unica istanza della classe
    private static Singleton instance = null;

    // Costruttore privato
    private Singleton() {
      // ...
    }

    // Metodo pubblico che si fa carico dell'istanziazione della classe
    public static synchronized Singleton instance() {
      if(instance == null) {
        instance = new Singleton(); // La classe non era mai stata creata
      }
      return instance;
    }

  }

Per la lista completa di tutti i design pattern fate riferimento a questa pagina.

Pubblicato in Design Pattern, Guide, Java, Programmazione Taggato con: , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*