V objektno usmerjenem programiranju je razred java singleton razred, ki ima lahko samo en objekt (primerek razreda) hkrati. Če po prvem poskusu instanciramo razrede Java Singleton, nova spremenljivka kaže tudi na prvo ustvarjeno instanco. Torej kakršne koli spremembe, ki jih naredimo na kateri koli spremenljivki znotraj razreda prek katerega koli primerka, vplivajo na spremenljivko posameznega ustvarjenega primerka in so vidne, če dostopamo do te spremenljivke prek katere koli spremenljivke tega definiranega tipa razreda.
Zapomnite si ključne točke pri definiranju razreda kot razreda z enim elementom, torej med načrtovanjem razreda z enim elementom:
- Naredite konstruktorja zasebnega.
- Napišite statično metodo, ki ima objekt vrnjenega tipa tega razreda singleton. Tu se za pisanje te statične metode uporablja koncept lene inicializacije.
Namen razreda Singleton
Primarni namen razreda java Singleton je omejiti število stvaritev objektov samo na enega. To pogosto zagotavlja, da obstaja nadzor dostopa do virov, na primer do vtičnice ali povezave z bazo podatkov.
Pri uporabi razreda singleton ne pride do izgube pomnilniškega prostora, ker omejuje ustvarjanje primerkov. Ker bo ustvarjanje objekta potekalo samo enkrat, namesto da bi ga ustvarili ob vsaki novi zahtevi.
Ta posamezen predmet lahko uporabimo večkrat v skladu z zahtevami. To je razlog, zakaj večnitne aplikacije in aplikacije baze podatkov večinoma uporabljajo vzorec Singleton v Javi za predpomnjenje, beleženje, združevanje niti, konfiguracijske nastavitve in še veliko več.
Na primer, pri nas je licenca in imamo samo eno povezavo z bazo podatkov ali pa predpostavimo, da nam naš gonilnik JDBC ne dovoli večnitnosti, potem nastopi razred Singleton in poskrbi, da naenkrat obstaja samo ena povezava ali ena nit lahko dostopa do povezave.
Kako oblikovati/ustvariti razred Singleton v Javi?
Če želite ustvariti razred singleton, moramo slediti spodnjim korakom:
1. Zagotovite, da obstaja samo en primerek razreda.
2. Zagotovite globalni dostop do tega primerka z
- Razglasitev vseh konstruktorjev razreda za zasebne.
- Zagotavljanje statične metode, ki vrne sklic na primerek. Za pisanje statičnih metod se uporablja koncept lene inicializacije.
- Primerek je shranjen kot zasebna statična spremenljivka.
Primer enojnih razredov je Runtime class, Action Servlet in Service Locator . Zasebni konstruktorji in tovarniške metode so prav tako primer razreda singleton.
Razlika med običajnim razredom in razredom Singleton
Razred Singleton lahko razlikujemo od običajnih razredov glede na proces instanciranja predmeta razreda. Za instanciranje običajnega razreda uporabimo konstruktor java. Po drugi strani pa za instanciranje razreda singleton uporabljamo metodo getInstance().
Druga razlika je v tem, da običajni razred izgine na koncu življenjskega cikla aplikacije, medtem ko se razred singleton ne uniči z dokončanjem aplikacije.
Oblike vzorca razreda Singleton
Obstajata dve obliki enodelnih oblikovalskih vzorcev, ki sta:
- Zgodnja instancacija: Ustvarjanje objekta poteka v času nalaganja.
- Leni primerek: Izdelava objekta se izvede v skladu z zahtevami.
Izvedba: Oglejmo si na kratko, kako se razred singleton razlikuje od običajnega razreda v Javi. Tukaj je razlika v smislu instanciranja, saj za običajni razred uporabljamo konstruktor, medtem ko za razred singleton uporabljamo metoda getInstance(). ki ga bomo pokukali v primeru 1, kot je prikazano spodaj. Na splošno lahko v izogib zmedi ime razreda uporabimo tudi kot ime metode, ko definiramo to metodo, ki bo prikazana v primeru 2 spodaj, kot sledi.
Primer 1:
Java
// 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'> );> > }> > }> }> |
java hashmap
>
>Izhod
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>
Izhodna razlaga:
nfa v dfa
V razredu singleton, ko prvič pokličemo metoda getInstance(). , ustvari objekt razreda z imenom single_instance in ga vrne spremenljivki. Ker je single_instance statičen, se spremeni iz null v nek predmet. Če bomo naslednjič poskusili poklicati metodo getInstance(), ker single_instance ni ničelna, bo vrnjena v spremenljivko, namesto da bi znova instancirala razred Singleton. Ta del je narejen s pogojem if.
V glavnem razredu instanciramo razred singleton s tremi objekti x, y in z, tako da pokličemo statični metoda getInstance() . Toda dejansko sta po ustvarjanju objekta x spremenljivki y in z usmerjeni na objekt x, kot je prikazano v diagramu. Torej, če spremenimo spremenljivke objekta x, se to odraža, ko dostopamo do spremenljivk objektov y in z. Tudi če spremenimo spremenljivke objekta z, se to odraža, ko dostopamo do spremenljivk objektov x in y.
Zdaj smo končali s pokrivanjem vseh vidikov primera 1 in smo ga implementirali, zdaj pa bomo implementirali razred Singleton z imenom metode kot imenom razreda.
Primer 2:
Java
// 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);> > }> }> |
>
>Izhod
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>
Pojasnilo: V razredu singleton, ko prvič pokličemo metodo Singleton(), ta ustvari objekt razreda Singleton z imenom single_instance in ga vrne spremenljivki. Ker je single_instance statičen, se spremeni iz null v nek predmet. Če naslednjič poskusimo poklicati metodo Singleton(), ker single_instance ni ničelna, se vrne v spremenljivko, namesto da bi znova instancirali razred Singleton.
Nadaljnje branje: Vadnica za vzorce oblikovanja Java