logo

Singleton Method Design Pattern i Java

I objektorienterad programmering är en java singleton-klass en klass som bara kan ha ett objekt (en instans av klassen) åt gången. Efter första gången, om vi försöker instansiera Java Singleton-klasserna, pekar den nya variabeln också på den första instansen som skapades. Så vilka ändringar vi än gör av någon variabel inuti klassen genom en instans, påverkar variabeln för den enda instans som skapas och är synlig om vi kommer åt den variabeln genom någon variabel av den klasstypen som definieras.

Kom ihåg nyckelpunkterna när du definierar en klass som en singleton-klass, vilket är när du designar en singleton-klass:

  1. Gör en konstruktör privat.
  2. Skriv en statisk metod som har returtypens objekt för denna singleton-klass. Här används begreppet Lazy-initiering för att skriva denna statiska metod.

Syftet med Singleton Class

Det primära syftet med en Java Singleton-klass är att begränsa gränsen för antalet objektskapelser till endast ett. Detta säkerställer ofta att det finns åtkomstkontroll till resurser, till exempel socket eller databasanslutning.



Slöseri med minnesutrymme uppstår inte med användningen av singleton-klassen eftersom det begränsar skapande av instanser. Eftersom objektskapandet endast kommer att ske en gång istället för att skapa det varje gång en ny begäran görs.

Vi kan använda detta enda objekt upprepade gånger enligt kraven. Detta är anledningen till att flertråds- och databasapplikationer mest använder sig av Singleton-mönstret i Java för cachelagring, loggning, trådpooling, konfigurationsinställningar och mycket mer.

Till exempel, det finns en licens hos oss, och vi har bara en databasanslutning eller antar att vår JDBC-drivrutin inte tillåter oss att göra multithreading, då kommer Singleton-klassen in i bilden och ser till att åt gången bara en enda anslutning eller en enda tråd kan komma åt anslutningen.

Hur man designar/skapar en Singleton-klass i Java?

För att skapa en singleton-klass måste vi följa stegen nedan:

1. Se till att det bara finns en instans av klassen.

2. Ge global åtkomst till den instansen genom

  • Deklarerar att alla konstruktörer i klassen är privata.
  • Tillhandahåller en statisk metod som returnerar en referens till instansen. Det lata initialiseringskonceptet används för att skriva de statiska metoderna.
  • Förekomsten lagras som en privat statisk variabel.

Exempel på singelklasser är Runtime class, Action Servlet och Service Locator . Privata konstruktörer och fabriksmetoder är också ett exempel på singelklassen.

Skillnaden mellan normalklass och singelklass

Vi kan skilja en Singleton-klass från de vanliga klasserna med avseende på processen att instansiera klassens objekt. För att instansiera en normal klass använder vi en java-konstruktor. Å andra sidan, för att instansiera en singleton-klass använder vi metoden getInstance().

Den andra skillnaden är att en normal klass försvinner i slutet av applikationens livscykel medan singletonklassen inte förstör när en applikation slutförs.

Former av Singleton Class Pattern

Det finns två former av singleton designmönster, som är:

  • Tidig instansiering: Objektskapandet sker vid laddningstiden.
  • Lat instansiering: Objektskapandet görs enligt kravet.

Genomförande: Låt oss kortfattat hur singletonklassen skiljer sig från normalklassen i java. Här är skillnaden när det gäller instansiering eftersom vi för normalklass använder en konstruktor, medan vi för singleton-klass använder getInstance() metod som vi kommer att titta på i exempel 1 som avbildas nedan. I allmänhet, för att undvika förvirring, kan vi också använda klassnamnet som metodnamn samtidigt som vi definierar denna metod som kommer att avbildas i exempel 2 nedan enligt följande.

Exempel 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>

Utgångsförklaring:

Singleton klass

I en singelklass, när vi första gången ringer getInstance() metod , skapar den ett objekt av klassen med namnet single_instance och returnerar det till variabeln. Eftersom single_instance är statisk ändras den från null till något objekt. Nästa gång, om vi försöker anropa getInstance()-metoden eftersom single_instance inte är null, returneras den till variabeln, istället för att instansiera Singleton-klassen igen. Denna del görs av if condition.

I huvudklassen instansierar vi singelklassen med 3 objekt x, y och z genom att anropa den statiska metod getInstance() . Men faktiskt, efter skapandet av objekt x, pekas variablerna y och z på objekt x som visas i diagrammet. Därför, om vi ändrar variablerna för objekt x, återspeglas det när vi kommer åt variablerna för objekten y och z. Även om vi ändrar variablerna för objekt z, återspeglas det när vi kommer åt variablerna för objekten x och y.

Nu är vi klara med att täcka alla aspekter av exempel 1 och har implementerat detsamma, nu kommer vi att implementera Singleton-klassen med metodnamnet som klassnamnet.

gigabyte vs megabyte

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

>

>

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>

Förklaring: I singleton-klassen, när vi första gången anropar Singleton()-metoden, skapar den ett objekt av klassen Singleton med namnet single_instance och returnerar det till variabeln. Eftersom single_instance är statisk ändras den från null till något objekt. Nästa gång om vi försöker anropa Singleton()-metoden, eftersom single_instance inte är null, returneras den till variabeln, istället för att instansiera Singleton-klassen igen.

Läs vidare: Handledning för Java-designmönster