Nella programmazione orientata agli oggetti, una classe Java Singleton è una classe che può avere un solo oggetto (un'istanza della classe) alla volta. Dopo la prima volta, se proviamo ad istanziare le classi Java Singleton, la nuova variabile punta anche alla prima istanza creata. Quindi qualunque modifica apportiamo a qualsiasi variabile all'interno della classe attraverso qualsiasi istanza, influisce sulla variabile della singola istanza creata ed è visibile se accediamo a quella variabile attraverso qualsiasi variabile di quel tipo di classe definita.
Ricorda i punti chiave mentre definisci una classe come classe singleton ovvero durante la progettazione di una classe singleton:
- Rendi privato un costruttore.
- Scrivi un metodo statico che abbia l'oggetto del tipo restituito di questa classe singleton. In questo caso, per scrivere questo metodo statico viene utilizzato il concetto di inizializzazione lazy.
Scopo della classe Singleton
Lo scopo principale di una classe Java Singleton è limitare il numero di creazioni di oggetti a una sola. Ciò spesso garantisce che vi sia il controllo dell'accesso alle risorse, ad esempio la connessione socket o database.
xd xd significato
Lo spreco di spazio di memoria non si verifica con l'uso della classe singleton perché limita la creazione di istanze. Poiché la creazione dell'oggetto avverrà una sola volta invece di crearlo ogni volta che viene effettuata una nuova richiesta.
Possiamo utilizzare questo singolo oggetto ripetutamente secondo i requisiti. Questo è il motivo per cui le applicazioni multi-thread e di database utilizzano principalmente il modello Singleton in Java per la memorizzazione nella cache, la registrazione, il pooling di thread, le impostazioni di configurazione e molto altro.
Ad esempio, abbiamo una licenza e abbiamo solo una connessione al database o supponiamo che il nostro driver JDBC non ci consenta di eseguire il multithreading, allora entra in gioco la classe Singleton e si assicura che alla volta, solo una connessione oppure un singolo thread può accedere alla connessione.
Come progettare/creare una classe Singleton in Java?
Per creare una classe singleton, dobbiamo seguire i passaggi indicati di seguito:
1. Assicurarsi che esista una sola istanza della classe.
2. Fornire l'accesso globale a tale istanza tramite
- Dichiarare privati tutti i costruttori della classe.
- Fornire un metodo statico che restituisce un riferimento all'istanza. Il concetto di inizializzazione pigra viene utilizzato per scrivere i metodi statici.
- L'istanza viene archiviata come variabile statica privata.
Un esempio di classi singleton è Classe runtime, Action Servlet e Service Locator . Anche i costruttori privati e i metodi factory sono un esempio della classe singleton.
Differenza tra classe normale e classe singleton
Possiamo distinguere una classe Singleton dalle solite classi rispetto al processo di istanziazione dell'oggetto della classe. Per istanziare una classe normale, utilizziamo un costruttore Java. D'altra parte, per istanziare una classe singleton, utilizziamo il metodo getInstance().
L'altra differenza è che una classe normale svanisce alla fine del ciclo di vita dell'applicazione mentre la classe singleton non si distrugge con il completamento di un'applicazione.
Forme del modello di classe Singleton
Esistono due forme di modelli di progettazione singleton, che sono:
- Istanziazione anticipata: La creazione dell'oggetto avviene al momento del caricamento.
- Istanziazione pigra: La creazione dell'oggetto viene eseguita in base ai requisiti.
Implementazione: Vediamo brevemente come la classe singleton varia dalla classe normale in Java. Qui la differenza è in termini di istanziazione poiché per la classe normale utilizziamo un costruttore, mentre per la classe singleton utilizziamo il metodo getInstance() che vedremo nell'esempio 1 come illustrato di seguito. In generale, per evitare confusione, possiamo anche utilizzare il nome della classe come nome del metodo durante la definizione di questo metodo che verrà illustrato nell'esempio 2 di seguito come segue.
inizializzazione primavera
Esempio 1:
Giava
// Java program implementing Singleton class> // with using getInstance() method> // Class 1> // Helper class> class> Singleton {> >// Static variable reference of single_instance> >// of type Singleton> >private> static> Singleton single_instance =>null>;> >// Declaring a variable of type String> >public> String s;> >// Constructor> >// Here we will be creating private constructor> >// restricted to this class itself> >private> Singleton()> >{> >s =>'Hello I am a string part of Singleton class'>;> >}> >// Static method> >// Static method to create instance of Singleton class> >public> static> synchronized> Singleton getInstance()> >{> >if> (single_instance ==>null>)> >single_instance =>new> Singleton();> >return> single_instance;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Instantiating Singleton class with variable x> >Singleton x = Singleton.getInstance();> >// Instantiating Singleton class with variable y> >Singleton y = Singleton.getInstance();> >// Instantiating Singleton class with variable z> >Singleton z = Singleton.getInstance();> >// Printing the hash code for above variable as> >// declared> >System.out.println(>'Hashcode of x is '> >+ x.hashCode());> >System.out.println(>'Hashcode of y is '> >+ y.hashCode());> >System.out.println(>'Hashcode of z is '> >+ z.hashCode());> >// Condition check> >if> (x == y && y == z) {> >// Print statement> >System.out.println(> >'Three objects point to the same memory location on the heap i.e, to the same object'>);> >}> >else> {> >// Print statement> >System.out.println(> >'Three objects DO NOT point to the same memory location on the heap'>);> >}> >}> }> |
>
>Produzione
Hashcode of x is 558638686 Hashcode of y is 558638686 Hashcode of z is 558638686 Three objects point to the same memory location on the heap i.e, to the same object>
Spiegazione dell'uscita:

In una classe singleton, quando chiamiamo per la prima volta il file metodo getInstance() , crea un oggetto della classe con il nome single_instance e lo restituisce alla variabile. Poiché single_instance è statico, viene modificato da null a qualche oggetto. La prossima volta, se proviamo a chiamare il metodo getInstance() poiché single_instance non è null, verrà restituito alla variabile, invece di istanziare nuovamente la classe Singleton. Questa parte viene eseguita da if condizione.
Nella classe principale, istanziamo la classe singleton con 3 oggetti x, y e z chiamando il metodo statico metodo getInstance() . Ma in realtà, dopo la creazione dell'oggetto x, le variabili yez vengono puntate all'oggetto x come mostrato nel diagramma. Quindi, se cambiamo le variabili dell'oggetto x, ciò si riflette quando accediamo alle variabili degli oggetti y e z. Inoltre, se cambiamo le variabili dell'oggetto z, ciò si riflette quando accediamo alle variabili degli oggetti xey.
la rotellina del mouse non scorre correttamente
Ora abbiamo finito di coprire tutti gli aspetti dell'esempio 1 e abbiamo implementato lo stesso, ora implementeremo la classe Singleton con il nome del metodo uguale a quello del nome della classe.
Esempio 2:
Giava
// Java program implementing Singleton class> // with method name as that of class> // Class 1> // Helper class> class> Singleton {> >// Static variable single_instance of type Singleton> >private> static> Singleton single_instance =>null>;> >// Declaring a variable of type String> >public> String s;> >// Constructor of this class> >// Here private constructor is used to> >// restricted to this class itself> >private> Singleton()> >{> >s =>'Hello I am a string part of Singleton class'>;> >}> >// Method> >// Static method to create instance of Singleton class> >public> static> Singleton Singleton()> >{> >// To ensure only one instance is created> >if> (single_instance ==>null>) {> >single_instance =>new> Singleton();> >}> >return> single_instance;> >}> }> // Class 2> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Instantiating Singleton class with variable x> >Singleton x = Singleton.Singleton();> >// Instantiating Singleton class with variable y> >Singleton y = Singleton.Singleton();> >// instantiating Singleton class with variable z> >Singleton z = Singleton.Singleton();> >// Now changing variable of instance x> >// via toUpperCase() method> >x.s = (x.s).toUpperCase();> >// Print and display commands> >System.out.println(>'String from x is '> + x.s);> >System.out.println(>'String from y is '> + y.s);> >System.out.println(>'String from z is '> + z.s);> >System.out.println(>'
'>);> >// Now again changing variable of instance z> >z.s = (z.s).toLowerCase();> >System.out.println(>'String from x is '> + x.s);> >System.out.println(>'String from y is '> + y.s);> >System.out.println(>'String from z is '> + z.s);> >}> }> |
>
>
vlc scarica youtubeProduzione
String from x is HELLO I AM A STRING PART OF SINGLETON CLASS String from y is HELLO I AM A STRING PART OF SINGLETON CLASS String from z is HELLO I AM A STRING PART OF SINGLETON CLASS String from x is hello i am a string part of singleton class String from y is hello i am a string part of singleton class String from z is hello i am a string part of singleton class>
Spiegazione: Nella classe Singleton, quando chiamiamo per la prima volta il metodo Singleton(), crea un oggetto della classe Singleton con il nome single_instance e lo restituisce alla variabile. Poiché single_instance è statico, viene modificato da null a qualche oggetto. La prossima volta se proviamo a chiamare il metodo Singleton(), poiché single_instance non è null, viene restituito alla variabile, invece di istanziare nuovamente la classe Singleton.
Ulteriori informazioni: Tutorial sui modelli di progettazione Java