Esistono implementazioni alternative per il pattern Singleton oltre al tradizionale uso di oggetti letterali in JavaScript. Vediamole in dettaglio.
La prima implementazione prevede la restituzione di un oggetto che racchiude la logica dell'oggetto singleton:
var mySingleton = function() {
// metodi e proprietà privati
var privateVariable = 'Privato';
function showPrivate() {
console.log(privateVariable);
}
// parte pubblica
return {
publicMethod: function() {
showPrivate();
},
publicVar: 'Pubblico'
};
};
Esempio d'uso:
var singleton = mySingleton();
singleton.publicMethod(); // 'Privato'
singleton.publicVar; // 'Pubblico'
La seconda implementazione invece prevede anche la creazione di un metodo pubblico per ottenere un'istanza dell'oggetto singleton:
var mySingleton = (function() {
var instantiated;
function init() {
// qui il singleton
return {
publicMethod: function() {
console.log('hello world');
},
publicProperty: 'test'
};
}
return {
getInstance: function() {
// controllo che non sia già stato istanziato
if (!instantiated) {
instantiated = init();
}
return instantiated;
}
};
})();
Esempio d'uso:
var singleton = mySingleton.getInstance();
singleton.publicMethod(); // 'hello world'
Come si può notare, la seconda implementazione segue da vicino lo schema già visto in altri linguaggi, come PHP.