logo

Ontwerppatroon van de Singleton-methode in Java

Bij objectgeoriënteerd programmeren is een Java Singleton-klasse een klasse die slechts één object (een instantie van de klasse) tegelijk kan hebben. Als we na de eerste keer proberen de Java Singleton-klassen te instantiëren, verwijst de nieuwe variabele ook naar de eerste gemaakte instantie. Dus welke wijzigingen we ook aanbrengen aan een variabele binnen de klasse via een instantie, heeft invloed op de variabele van de gemaakte enkele instantie en is zichtbaar als we toegang krijgen tot die variabele via een variabele van dat gedefinieerde klassetype.

Onthoud de belangrijkste punten bij het definiëren van een klasse als een singleton-klasse, dat wil zeggen bij het ontwerpen van een singleton-klasse:



  1. Maak een constructor privé.
  2. Schrijf een statische methode die het return type object van deze singleton-klasse heeft. Hier wordt het concept van Lazy-initialisatie gebruikt om deze statische methode te schrijven.

Doel van de Singleton-klasse

Het primaire doel van een Java Singleton-klasse is om de limiet van het aantal objectcreaties te beperken tot slechts één. Dit zorgt er vaak voor dat er toegangscontrole is tot bronnen, bijvoorbeeld socket- of databaseverbinding.

Er treedt geen verspilling van geheugenruimte op bij het gebruik van de klasse singleton, omdat dit het maken van exemplaren beperkt. Omdat het maken van objecten slechts één keer zal plaatsvinden in plaats van het elke keer dat er een nieuw verzoek wordt gedaan, te maken.

We kunnen dit ene object herhaaldelijk gebruiken volgens de vereisten. Dit is de reden waarom multi-threaded- en databaseapplicaties meestal gebruik maken van het Singleton-patroon in Java voor caching, loggen, threadpooling, configuratie-instellingen en nog veel meer.



Er is bijvoorbeeld een licentie bij ons, en we hebben maar één databaseverbinding, of stel dat onze JDBC-driver ons niet toestaat om aan multithreading te doen, dan komt de klasse Singleton in beeld en zorgt ervoor dat er tegelijkertijd maar één verbinding is of een enkele thread heeft toegang tot de verbinding.

Hoe ontwerp / creëer je een Singleton-klasse in Java?

Om een ​​singleton-klasse te maken, moeten we de onderstaande stappen volgen:

1. Zorg ervoor dat er slechts één exemplaar van de klasse bestaat.



2. Bied globale toegang tot dat exemplaar door

  • Alle constructors van de klasse als privé verklaren.
  • Het verstrekken van een statische methode die een verwijzing naar de instantie retourneert. Het luie initialisatieconcept wordt gebruikt om de statische methoden te schrijven.
  • De instantie wordt opgeslagen als een persoonlijke statische variabele.

Een voorbeeld van singleton-klassen is Runtimeklasse, Action Servlet en Service Locator . Particuliere constructeurs en fabrieksmethoden zijn ook een voorbeeld van de singleton-klasse.

Verschil tussen normale klasse en Singleton-klasse

We kunnen een Singleton-klasse onderscheiden van de gebruikelijke klassen met betrekking tot het proces van het instantiëren van het object van de klasse. Om een ​​normale klasse te instantiëren, gebruiken we een Java-constructor. Aan de andere kant gebruiken we de methode getInstance() om een ​​singleton-klasse te instantiëren.

Java-tekenreeks naar int

Het andere verschil is dat een normale klasse aan het einde van de levenscyclus van de applicatie verdwijnt, terwijl de singleton-klasse niet verdwijnt bij voltooiing van een applicatie.

Vormen van Singleton Class-patroon

Er zijn twee vormen van singleton-ontwerppatronen, namelijk:

  • Vroege instantiatie: Het maken van objecten vindt plaats tijdens het laden.
  • Luie instantiatie: Het maken van objecten gebeurt volgens de vereisten.

Implementatie: Laten we kort bekijken hoe de singleton-klasse verschilt van de normale klasse in Java. Hier ligt het verschil in termen van instantiatie, aangezien we voor de normale klasse een constructor gebruiken, terwijl we voor de singleton-klasse de getInstance()-methode waar we naar zullen kijken in voorbeeld 1, zoals hieronder weergegeven. Om verwarring te voorkomen kunnen we over het algemeen ook de klassenaam als methodenaam gebruiken bij het definiëren van deze methode, die in voorbeeld 2 hieronder als volgt wordt weergegeven.

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

>

>

Uitvoer

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>

Uitvoer uitleg:

Singleton-klasse

In een singleton-klas, wanneer we voor het eerst de getInstance()-methode , het creëert een object van de klasse met de naam single_instance en retourneert dit naar de variabele. Omdat single_instance statisch is, wordt het gewijzigd van nul naar een object. Als we de volgende keer de methode getInstance() proberen aan te roepen, omdat single_instance niet null is, wordt deze teruggestuurd naar de variabele, in plaats van de klasse Singleton opnieuw te instantiëren. Dit deel wordt gedaan door de if-voorwaarde.

In de hoofdklasse instantiëren we de singleton-klasse met 3 objecten x, y en z door de statische aan te roepen methode getInstance() . Maar feitelijk worden de variabelen y en z na het maken van object x naar object x verwezen, zoals weergegeven in het diagram. Als we dus de variabelen van object x veranderen, wordt dat weerspiegeld wanneer we toegang krijgen tot de variabelen van objecten y en z. Ook als we de variabelen van object z veranderen, wordt dat weerspiegeld wanneer we toegang krijgen tot de variabelen van objecten x en y.

Nu zijn we klaar met het behandelen van alle aspecten van voorbeeld 1 en hebben we hetzelfde geïmplementeerd. Nu gaan we de Singleton-klasse implementeren met de methodenaam als die van de klassenaam.

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

>

>

Uitvoer

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>

Uitleg: Wanneer we in de klasse singleton voor het eerst de methode Singleton() aanroepen, wordt er een object van de klasse Singleton gemaakt met de naam single_instance en wordt dit teruggegeven aan de variabele. Omdat single_instance statisch is, wordt het gewijzigd van nul naar een object. Als we de volgende keer de methode Singleton() proberen aan te roepen, wordt deze, omdat single_instance niet null is, teruggestuurd naar de variabele, in plaats van de klasse Singleton opnieuw te instantiëren.

Verder lezen: Zelfstudie over Java-ontwerppatronen