Il modello singleton è uno dei modelli di progettazione più semplici. Una classe che usa il modello di progettazione singleton ha una singola istanza che gestisce autonomamente. Questa classe impedisce a qualsiasi altra classe di crearne un'istanza.
Una classe singleton fornisce anche un singolo punto di accesso globale all'istanza che crea. Pertanto, qualsiasi classe che desideri un'istanza di una classe singleton deve accedervi tramite il suo unico punto di accesso.
L'eccellente supporto di Java per la programmazione orientata agli oggetti semplifica l'utilizzo del modello di progettazione singleton.
Implementazione del modello Singleton utilizzando Java
Esistono molti modi per implementare il pattern singleton in Java; gli approcci desiderosi e pigri sono variazioni comuni. Ciascuno di questi approcci ha i suoi meriti e svantaggi. Pertanto, il metodo che scegli di utilizzare dovrebbe dipendere da come funzionerà la tua applicazione.
L'approccio impaziente
L'implementazione del modello singleton con l'approccio desideroso significa che la classe crea una nuova istanza di se stessa quando viene caricata.
pubblicoclasseDesiderosoSingleton{
privatostatico Istanza EagerSingleton = nuovo EagerSingleton();privatoDesiderosoSingleton(){}
pubblicostatico DesiderosoSingleton getInstance(){
ritorno esempio;
}
}
IL DesiderosoSingletonClasse Java crea una nuova istanza di se stesso durante il caricamento. Assegna questa istanza alla statica privata variabile di istanza, che è accessibile solo all'interno della classe singleton. L'unico punto di accesso esterno alla variabile di istanza è attraverso il file getInstance() metodo. Tale metodo restituisce l'istanza della classe creata in precedenza.
Questo approccio è ottimo in quanto impedisce il multithread problema, che è una delle maggiori sfide del modello singleton. Risolve il problema del multithreading creando una nuova istanza di se stesso prima che qualsiasi nuovo thread possa accedere alla sua variabile di istanza. Ciò garantisce che ogni thread avrà accesso solo alla stessa istanza.
Tuttavia, l'approccio desideroso è pratico solo se l'applicazione utilizzerà un'istanza della classe singleton all'avvio dell'esecuzione. In caso contrario, creerai un oggetto prima che la tua applicazione ne abbia bisogno, utilizzando risorse inutilmente.
L'approccio pigro
L'approccio pigro è la soluzione al problema dell'approccio ansioso. Ti consente di creare una nuova istanza di una classe singleton solo quando il tuo programma ne ha bisogno.
pubblicoclasseLazySingleton{
privatovolatilestatico Istanza LazySingleton;privatoLazySingleton(){}
pubblicostatico LazySingleton getInstance(){
Se (istanza == nullo) {
sincronizzato (LazySingleton.classe) {
Se (istanza == nullo) {
istanza = nuovo LazySingleton();
}
}
}
ritorno esempio;
}
}
L'approccio pigro risolve il problema del multithreading utilizzando l' sincronizzato parola chiave. Ciò impedisce a due thread di accedere contemporaneamente alla variabile di istanza. Tuttavia, Synchronized è costoso, quindi l'applicazione lo utilizza solo una volta, quando chiama per la prima volta getInstance().
Quando utilizzare il modello Singleton
Il modello Singleton è utile in molti scenari, per creare finestre di dialogo, gestire le impostazioni del Registro di sistema o gestire i pool di thread.
Un altro uso comune del modello singleton è creare una classe centrale che gestisca le connessioni al database.