Il Singleton Pattern
è un pattern che prevede l'esistenza di un'unica istanza di un oggetto. Per un linguaggio di programmazione basato sulle classi questo significa che una classe può essere istanziata una sola volta e che gli eventuali tentativi di creare una nuova istanza della classe ottengono l'istanza già creata.
In JavaScript possiamo creare oggetti direttamente, dal momento che non sono previste classi. Quindi ogni oggetto è in realtà già un singleton
.
var singleton = {
proprieta: "abc",
metodo: function() {
// ...
}
};
singleton.metodo();
Che bisogno abbiamo di implementare questo design pattern?
Nell'esempio abbiamo creato l'oggetto nel contesto globale e una volta creato è disponibile in qualsiasi punto della nostra applicazione. Tuttavia non è detto che l'oggetto venga effettivamente utilizzato nel corso dell'esecuzione. Se in base ad un determinato flusso di esecuzione dell'applicazione non facciamo uso dell'oggetto, abbiamo sprecato inutilmente risorse per la sua creazione. Inoltre, se per l'inizializzazione del nostro oggetto abbiamo bisogno di dati non disponibili, dobbiamo necessariamente rimandare la creazione dell'istanza.
Per gestire efficacemente queste situazioni possiamo implementare il singleton come mostrato nel seguente esempio:
var singleton = (function(){
var instance;
return {
getInstance: function() {
if (!instance) {
instance = { proprieta: "abc", metodo: function() { //... } };
}
return instance;
}
};
})();
Ricorriamo ancora una volta ad una espressione IIFE per proteggere l'istanza effettiva del nostro oggetto. Il risultato dell'espressione assegnata alla variabile singleton è un oggetto con un solo metodo getInstance()
. Il singleton vero e proprio sarà creato quando sarà invocato questo metodo, il quale si preoccuperà di verificare se esiste già un'istanza dell'oggetto e solo se non esiste la creerà.
L'utilizzo tipico del singleton è quello mostrato di seguito:
var mySingleton = singleton.getInstance();
console.log(mySingleton.proprieta); //"abc"