logo

Singleton Method Design Pattern Javassa

Olio-ohjelmoinnissa java singleton -luokka on luokka, jossa voi olla vain yksi objekti (luokan esiintymä) kerrallaan. Ensimmäisen kerran jälkeen, jos yritämme ilmentää Java Singleton -luokkia, uusi muuttuja viittaa myös ensimmäiseen luotuun esiintymään. Joten kaikki muutokset, joita teemme mihin tahansa muuttujaan luokan sisällä minkä tahansa esiintymän kautta, vaikuttavat luodun yksittäisen ilmentymän muuttujaan ja ovat näkyvissä, jos käytämme tätä muuttujaa minkä tahansa määritetyn luokkatyypin muuttujan kautta.

Muista tärkeimmät kohdat, kun määrität luokkaa yksitoistaiseksi luokkaksi, mikä on suunniteltaessa yksitoista luokkaa:



  1. Tee rakentajasta yksityinen.
  2. Kirjoita staattinen menetelmä, jolla on tämän singleton-luokan paluutyyppiobjekti. Tässä laiskan alustuksen käsitettä käytetään tämän staattisen menetelmän kirjoittamiseen.

Singleton-luokan tarkoitus

Java Singleton -luokan ensisijainen tarkoitus on rajoittaa objektiluomien lukumäärää vain yhteen. Tämä varmistaa usein, että resursseihin, esimerkiksi pistorasiaan tai tietokantayhteyteen, on pääsy.

Muistitilan tuhlausta ei tapahdu käytettäessä singleton-luokkaa, koska se rajoittaa ilmentymien luomista. Koska objektin luonti tapahtuu vain kerran sen sijaan, että se luodaan joka kerta, kun uusi pyyntö tehdään.

Voimme käyttää tätä yhtä objektia toistuvasti vaatimusten mukaisesti. Tästä syystä monisäikeiset ja tietokantasovellukset käyttävät enimmäkseen Javan Singleton-mallia välimuistiin, lokiin, säikeiden yhdistämiseen, konfigurointiasetuksiin ja paljon muuta.



Esimerkiksi meillä on lisenssi ja meillä on vain yksi tietokantayhteys tai oletetaan, että JDBC-ajurimme ei salli monisäikeistystä, niin Singleton-luokka tulee kuvaan ja varmistaa, että kerrallaan vain yksi yhteys tai yksi säie voi käyttää yhteyttä.

Kuinka suunnitella/luoda Singleton-luokka Javassa?

Yksittäisen luokan luomiseksi meidän on noudatettava alla olevia vaiheita:

1. Varmista, että luokassa on vain yksi esiintymä.



2. Tarjoa globaali pääsy kyseiseen esiintymään

  • Julistetaan kaikki luokan rakentajat yksityisiksi.
  • Staattisen menetelmän tarjoaminen, joka palauttaa viittauksen ilmentymään. Staattisten menetelmien kirjoittamiseen käytetään laiska alustuskonseptia.
  • Ilmentymä tallennetaan yksityisenä staattisena muuttujana.

Esimerkki singleton luokista on Runtime class, Action Servlet ja Service Locator . Yksityiset rakentajat ja tehdasmenetelmät ovat myös esimerkki singleton-luokasta.

Ero normaaliluokan ja yhden luokan välillä

Voimme erottaa Singleton-luokan tavallisista luokista luokan objektin ilmentämisprosessin suhteen. Normaalin luokan ilmentämiseen käytämme Java-konstruktoria. Toisaalta yksittäisen luokan ilmentämiseen käytämme getInstance()-menetelmää.

Toinen ero on, että normaali luokka katoaa sovelluksen elinkaaren lopussa, kun taas singleton-luokka ei tuhoudu sovelluksen valmistuttua.

Singleton Class Pattern -muodot

Yksittäisiä suunnittelukuvioita on kahta muotoa, jotka ovat:

tostring java
  • Varhainen toteutus: Objektin luonti tapahtuu lataushetkellä.
  • Laiska ilmentymä: Objektin luominen tehdään vaatimusten mukaisesti.

Toteutus: Katsotaanpa lyhyesti kuinka singleton-luokka eroaa javan normaalista luokasta. Tässä ero on ilmentymisen suhteen, sillä normaalissa luokassa käytämme konstruktoria, kun taas singleton luokassa käytämme getInstance() -menetelmä jota kurkistamme esimerkissä 1 alla kuvatulla tavalla. Yleisesti ottaen sekaannusten välttämiseksi voimme myös käyttää luokan nimeä menetelmän nimenä määriteltäessä tätä menetelmää, joka kuvataan alla olevassa esimerkissä 2 seuraavasti.

Esimerkki 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'>);> >}> >}> }>

>

>

Lähtö

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>

Lähtöselitys:

Singleton luokka

Yksittäisluokassa, kun soitamme ensimmäistä kertaa getInstance() -menetelmä , se luo luokan objektin, jonka nimi on single_instance, ja palauttaa sen muuttujaan. Koska yksiinstanssi on staattinen, se muutetaan nollasta johonkin objektiin. Jos seuraavan kerran yritämme kutsua menetelmää getInstance(), koska single_instance ei ole tyhjä, se palautetaan muuttujaan sen sijaan, että instantoisi Singleton-luokka uudelleen. Tämä osa tehdään if-ehdolla.

Pääluokassa instantoimme singleton-luokan 3 objektilla x, y ja z kutsumalla staattista menetelmä getInstance() . Mutta itse asiassa objektin x luomisen jälkeen muuttujat y ja z osoitetaan objektiin x, kuten kaaviossa näkyy. Siten, jos muutamme objektin x muuttujia, se heijastuu, kun pääsemme objektien y ja z muuttujiin. Myös jos muutamme objektin z muuttujia, se heijastuu, kun saamme käsiksi objektien x ja y muuttujat.

Nyt olemme kattaneet kaikki esimerkin 1 näkökohdat ja olemme toteuttaneet saman, nyt toteutamme Singleton-luokan menetelmän nimellä kuin luokan nimen.

Esimerkki 2:

Java


von Neumann -arkkitehtuuri



// 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);> >}> }>

>

>

Lähtö

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>

Selitys: Singleton-luokassa, kun kutsumme ensimmäistä kertaa Singleton()-metodia, se luo Singleton-luokan objektin nimeltä single_instance ja palauttaa sen muuttujaan. Koska yksiinstanssi on staattinen, se muutetaan nollasta johonkin objektiin. Jos seuraavan kerran yritämme kutsua Singleton()-metodia, koska single_instance ei ole null, se palautetaan muuttujaan sen sijaan, että instantoisi Singleton-luokka uudelleen.

Lue lisää: Java-suunnittelumallien opetusohjelma