Pattern Singleton e implementazione in Java

Problema: è consentita esattamente una sola istanza di una classe, cioè un "singleton". Gli oggetti hanno bisogno di un punto d'accesso globale e singolo a questo oggetto.

Soluzione: definire un metodo statico getIstance() della classe che restituisce il singleton.

Questo pattern evita di passare l'istanza della classe singleton come parametro ovunque ne sia richiesta visibilità: basta che essa possegga un metodo statico che restituisce un riferimento all'oggetto. E' un pattern usato in genere per oggetti Factory e Facade e concorre a fornire Protected Variation dalle interfacce variabili. Evita inoltre di rendere tutti i metodi della classe singleton statici: i metodi d'istanza sono preferibili in quanto possono essere estesi e acceduti da remoto.

L'implementazione di questo pattern è "pigra" (lazy), poiché l'istanza dell'oggetto non viene creata finché non viene richiesto un suo riferimento: in questo modo si è sicuri che l'istanza venga creata ed esita quando qualcuno invoca il metodo statico getIstance(). Tale metodo è in genere definito synchronized per gestire in sequenza chiamate contemporanee del metodo.

public class ServicesFactory {

// Singleton
private static ServicesFactory instance;

public static synchronized ServicesFactory getInstance() {
    /* Singleton: lazy creation */
    if(instance == null)
        instance = new ServicesFactory();
    return instance;
}

public ServicesFactory(){}

singleton UML