Comprendere i patterns e la loro utilità è la conferma di aver compreso bene il linguaggio Javascript; Trattandosi di protocolli-procedurali scritti da sviluppatori esperti, risultano estremamente utile per aprire ulteriormente e confermare la "forma mentis" acquisita da un programmatore.
Prendiamo un oggetto,
var oggetto = {
proprieta1: "abc",
proprieta2: "def"
}
il Singleton Pattern è un pattern che prevede che un oggetto sia istanziato una sola volta.
In realtà in JavaScript possiamo creare oggetti direttamente mediante la notazione letterale; ognuno di questi oggetti è già un singleton.
Qual'è allora lo scopo di questo pattern?
Quando creiamo un oggetto ad esempio nel contesto globale quest'ultimo è accessibile in qualsiasi punto della nostra applicazione; tuttavia, non è detto che questo oggetto sia da noi utilizzato nel corso della nostra programmazione e questo si traduce in un'inutile spreco di risorse per la sua creazione.
Inoltre, se per l'inizializzazione/creazione del nostro oggetto abbiamo bisogno di dati non ancora disponibili, come ad esempio, elementi non ancora caricati nel DOM di una pagina HTML, dovremo necessariamente posticipare la creazione dell'istanza.
Quindi possiamo riassumere in queste tre ragioni l'utilità del singleton pattern:
var oggettoSingleton=(function(){
var instanza;
return {
prendiIstanza: function(){
if(!instanza){
instanza = {
proprieta1: "abc",
proprieta2: "def"
}
return instanza;
}
}
}
})();
Per proteggere l'instanza effettiva del nostro oggetto e per fare in modo che sia creata solo al momento della nostra richiesta, ricorriamo a un espressione IIFE assegnandola alla variabile oggettoSingleton;
Inizialmente se richiamiamo la variabile oggettoSingleton otterremo il contenuto della funzione IIFE, ovvero un oggetto con all'interno un solo metodo prendiIstanza.
L'oggetto Singleton vero e proprio sarà creato quando invocheremo il metodo prendiIstanza(), il quale dopo aver controllato che non esiste tramite l'istruzione if creerà un ulteriore oggetto ottenendo quanto il pattern si era preposto.
var mySingleton = oggettoSingleton.prendiInstanza(); console.log(mySingleton.proprieta1); // "abc"
In particolar modo nel Singleton pattern sfruttiamo la capacità delle funzioni di restituire, con il comando "return", diversi tipi di dati e nel nostro caso specifico un'oggetto.