logo

Singleton Method Design Pattern i Java

I objektorienteret programmering er en java singleton-klasse en klasse, der kun kan have ét objekt (en forekomst af klassen) ad gangen. Efter første gang, hvis vi forsøger at instansiere Java Singleton-klasserne, peger den nye variabel også på den første instans, der blev oprettet. Så uanset hvilke ændringer vi foretager til en variabel inde i klassen gennem en instans, påvirker variablen for den oprettede enkelt instans og er synlig, hvis vi får adgang til den variabel gennem en hvilken som helst variabel af den definerede klassetype.

Husk nøglepunkterne, når du definerer en klasse som en singleton-klasse, hvilket er, når du designer en singleton-klasse:



  1. Gør en konstruktør privat.
  2. Skriv en statisk metode, der har returtypeobjektet for denne singleton-klasse. Her bruges begrebet Lazy initialization til at skrive denne statiske metode.

Formålet med Singleton Class

Det primære formål med en Java Singleton-klasse er at begrænse grænsen for antallet af objektskabelser til kun én. Dette sikrer ofte, at der er adgangskontrol til ressourcer, for eksempel socket eller databaseforbindelse.

Spild af hukommelsesplads forekommer ikke ved brug af singleton-klassen, fordi det begrænser oprettelse af forekomster. Da objektoprettelsen kun vil finde sted én gang i stedet for at oprette den, hver gang der foretages en ny anmodning.

Vi kan bruge dette enkelte objekt gentagne gange i henhold til kravene. Dette er grunden til, at multi-threaded og databaseapplikationer for det meste gør brug af Singleton-mønsteret i Java til caching, logning, trådpooling, konfigurationsindstillinger og meget mere.



For eksempel er der en licens hos os, og vi har kun én databaseforbindelse eller antager, at vores JDBC-driver ikke tillader os at lave multithreading, så kommer Singleton-klassen ind i billedet og sørger for, at der ad gangen kun er en enkelt forbindelse eller en enkelt tråd kan få adgang til forbindelsen.

Hvordan designer/opretter man en Singleton-klasse i Java?

For at oprette en singleton-klasse skal vi følge trinene nedenfor:

1. Sørg for, at der kun findes én forekomst af klassen.



konverter int til streng

2. Giv global adgang til den instans ved

  • Erklærer alle konstruktører af klassen for at være private.
  • Giver en statisk metode, der returnerer en reference til forekomsten. Det dovne initialiseringskoncept bruges til at skrive de statiske metoder.
  • Forekomsten gemmes som en privat statisk variabel.

Eksempel på singleton klasser er Runtime-klasse, Action Servlet og Service Locator . Private konstruktører og fabriksmetoder er også et eksempel på singleton-klassen.

Forskellen mellem normal klasse og singleton klasse

Vi kan skelne en Singleton-klasse fra de sædvanlige klasser med hensyn til processen med at instansiere klassens objekt. For at instantiere en normal klasse bruger vi en java-konstruktør. På den anden side bruger vi metoden getInstance() for at instansiere en singleton-klasse.

Den anden forskel er, at en normal klasse forsvinder i slutningen af ​​applikationens livscyklus, mens singleton-klassen ikke ødelægger med færdiggørelsen af ​​en applikation.

Former for Singleton-klassemønster

Der er to former for singleton-designmønstre, som er:

array i streng
  • Tidlig instansiering: Objektoprettelsen finder sted på indlæsningstidspunktet.
  • Doven instansiering: Objektoprettelsen udføres i henhold til kravet.

Implementering: Lad os kort hvordan singleton-klassen adskiller sig fra normalklassen i java. Her er forskellen med hensyn til instansiering, da vi for normal klasse bruger en konstruktør, hvorimod for singleton klasse bruger vi getInstance() metode som vi vil se i eksempel 1 som afbildet nedenfor. Generelt, for at undgå forvirring, kan vi også bruge klassenavnet som metodenavnet, mens vi definerer denne metode, som vil blive afbildet i eksempel 2 nedenfor som følger.

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

>

>

Produktion

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>

Output forklaring:

Singleton klasse

I en singleton klasse, når vi første gang ringer til getInstance() metode , opretter den et objekt af klassen med navnet single_instance og returnerer det til variablen. Da single_instance er statisk, ændres den fra null til et eller andet objekt. Næste gang, hvis vi forsøger at kalde getInstance()-metoden, da single_instance ikke er null, returneres den til variablen i stedet for at instansiere Singleton-klassen igen. Denne del udføres af if condition.

I hovedklassen instansierer vi singleton-klassen med 3 objekter x, y og z ved at kalde den statiske metode getInstance() . Men faktisk, efter oprettelsen af ​​objekt x, peges variable y og z på objekt x som vist i diagrammet. Derfor, hvis vi ændrer variablerne for objekt x, afspejles det, når vi får adgang til variablerne for objekterne y og z. Også hvis vi ændrer variablerne for objekt z, afspejles det, når vi får adgang til variablerne for objekterne x og y.

python er numerisk

Nu er vi færdige med at dække alle aspekter af eksempel 1 og har implementeret det samme, nu vil vi implementere Singleton-klassen med metodenavnet som klassenavnet.

Eksempel 2:

Java




markdown gennemstregning

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

>

>

Produktion

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>

Forklaring: I singleton-klassen, når vi første gang kalder Singleton()-metoden, opretter den et objekt af klassen Singleton med navnet single_instance og returnerer det til variablen. Da single_instance er statisk, ændres den fra null til et eller andet objekt. Næste gang, hvis vi prøver at kalde Singleton()-metoden, da single_instance ikke er null, returneres den til variablen i stedet for at instansiere Singleton-klassen igen.

Læs mere: Tutorial til Java-designmønstre