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(){}