7 modi per creare singleton in Javascript
Ciao, i miei amanti preferiti . Oggi parleremo della cosa più comune che potresti usare nel tuo progetto: Singleton Pattern .
Per uno di voi che è già a conoscenza di cosa sia singleton, continuate a scorrere, sono sicuro che questo articolo vi sorprenderà.
Per gli altri…
Singleton Pattern - è il più comunemente usato e una delle cose che vengono chieste in quasi tutte le interviste. Può essere descritto come un modello che limita l'utilizzo di una classe a un singolo utilizzo. In altre parole, nella tua applicazione è consentito avere solo un'istanza della tua classe.
Poiché questo è risolto, passiamo agli esempi.
Questo articolo includerà sia esempi Javascript che Typescript .
Singleton classico
Il modo più iconico e classico per implementare un singleton. Ne puoi trovare un esempio in ogni tutorial e in ogni libro di programmazione.
Esempio Javascript :
Esempio di dattiloscritto :
Ed ecco come usarlo:
ClassicSingleton.instance.invoke();
Professionisti
- Soluzione semplice, lineare e pulita
- Approccio più comune
- Inizializzato all'avvio dell'applicazione, cosa che può causare lentezza nell'avvio dell'applicazione
- Non può essere ereditato correttamente, il che significa che è necessario duplicare questo codice in ogni singola classe in cui si desidera utilizzare singleton
Lazy Singleton viene utilizzato principalmente quando non vuoi inizializzare subito il tuo singleton e vuoi usarlo, solo quando è richiesto. Un buon modo per eseguire la micro-ottimizzazione della tua app. In altre questioni è vicino a Classic Singleton .
Esempio Javascript :
Esempio di dattiloscritto :
Ed ecco come usarlo:
LazySingleton.instance().invoke();
Professionisti
- Inizializzato quando utilizzato e non occupa memoria quando non è stato chiamato
- Soluzione semplice e pulita
- Inizializzato quando utilizzato, cosa che può portare a piccoli ritardi al primo utilizzo
- Non può essere ereditato, il che significa che è necessario duplicare questo codice in ogni singola classe in cui si desidera utilizzare singleton
Quasi la stessa cosa di Lazy Singleton ma usiamo un getter invece di una semplice funzione, che ci permette di evitare l'uso di brutte parentesi ().
Esempio Javascript :
Esempio di dattiloscritto :
Come usarlo:
LazyGetterSingleton.instance.invoke();
Ha gli stessi pro e contro di Lazy Singleton .
Importa Singleton
Non si può dire che questo approccio sia comune, perché non tutti i linguaggi di programmazione seguono il paradigma dell'esportazione/importazione di dichiarazioni da file.
Esempio Javascript ES6 (Babel):
Esempio Javascript (nodo):
Esempio di dattiloscritto :
Come utilizzare Javascript ES6 (Babel) e la versione Typescript :
import { importSingletion } from "./ImportSingleton";
importSingleton.invoke();
const importSingleton = require("./ImportSingleton");
importSingleton.invoke()
Professionisti
- Soluzione semplice, lineare e pulita
- Inizializzato all'avvio dell'applicazione, cosa che può causare lentezza nell'avvio dell'applicazione
- Non può essere automatizzato, il che porta alla duplicazione della base di codice
Decoratore Singleton
Approccio interessante quando usi due pattern insieme: Singleton e Decorator .
L'idea di base è ridurre al minimo la duplicazione del codice.
Esempio Javascript :
Puoi usarlo con Typescript , ma sfortunatamente per impostazione predefinita Typescript non nota la proprietà dinamica e devi scrivere codice aggiuntivo, piuttosto sporco, affinché Typescript lo supporti. Ecco perché è preferibile non utilizzare questo approccio con Typescript .
Come usarlo:
DecoratorSingleton.instance.invoke();
- Soluzione semplice, lineare e pulita
- Puoi mantenere una base di codice abbastanza pulita ed evitare duplicazioni di codice
- Inizializzato all'avvio dell'applicazione, cosa che può causare lentezza nell'avvio dell'applicazione
Approccio interessante, che ancora una volta unisce due modelli insieme, Singleton e Decorator , ma ti consente anche di visualizzare i tuoi singleton da un'angolazione diversa. E come bonus, apre le porte a una profonda conoscenza di Javascript .
Esempio Javascript :
Esempio di dattiloscritto :
Ed ecco come utilizzare le versioni Javascript e Typescript :
new BindSingleton().invoke()
BindSingleton().invoke()
Puoi verificare la correttezza con:
new ConstructorSingleton() === new ConstructorSingleton() // => true
ConstructorSingleton() === ConstructorSingleton() // => true
Bene, semplice. Prima di tutto, la nostra BindSingletonnon è mai stata una classe, è una funzione. Ecco perché possiamo usarlo BindSingleton()su di esso. Fantastico, vero?
Ora, che dire di new BindSingleton(), perché continua a restituire la stessa istanza? Abbastanza ovvio ancora una volta, la nostra logica controlla la instancefunzione controlla la proprietà statica nella classe, se la proprietà non esiste creiamo un'istanza della nostra classe e se la proprietà esiste, la usiamo invece di inizializzare una nuova istanza.
Professionisti
- Fornisce molti modi per accedere al tuo singleton
- Considerato Lazy Singleton
- Puoi mantenere la tua base di codice abbastanza pulita
- Richiede una profonda conoscenza di Javascript e può confondere gli sviluppatori inesperti
- Rispetto ad altri metodi, molto codice.
Costruttore Singleton
Questo richiede una comprensione davvero profonda di come funziona Javascript , ma è davvero una soluzione elegante.
Esempio Javascript :
Esempio di dattiloscritto:
Ed ecco come usarlo:
new ConstructorSingleton().invoke()
new ConstructorSingleton() === new ConstructorSingleton() // => true
Quando eseguiamo per la prima volta il nostro codice, si inizializza cachee la nostra creazione dell'istanza quando arriva a constructor, controlla il valore restituito e nel costruttore di prima esecuzione return undefinedche forza Javascript a creare una nuova istanza della classe. Ma tutte le esecuzioni successive otterranno la nostra istanza cachee constructorrestituiranno la nostra istanza invece di undefinedindicare a Javascript che dovrebbe restituire la nostra istanza esistente.
Contro :
- Richiede una profonda conoscenza di Javascript
- Inizializzato all'avvio dell'applicazione, cosa che può causare lentezza nell'avvio dell'applicazione
- Non può essere ereditato correttamente, il che significa che è necessario duplicare questo codice in ogni singola classe in cui si desidera utilizzare singleton
Risorse
- Collegamento al deposito
Non dimenticare di seguirmi per saperne di più!
La tua parte. 01101100 01101111 01110110 01100101

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































