logo

Patró de disseny del mètode Singleton a Java

En la programació orientada a objectes, una classe java singleton és una classe que només pot tenir un objecte (una instància de la classe) alhora. Després de la primera vegada, si intentem crear una instancia de les classes Java Singleton, la nova variable també apunta a la primera instància creada. Per tant, qualsevol modificació que fem a qualsevol variable dins de la classe a través de qualsevol instància, afecta la variable de la única instància creada i és visible si accedim a aquesta variable a través de qualsevol variable d'aquest tipus de classe definida.

Recordeu els punts clau mentre definiu una classe com a classe singleton que és mentre dissenyeu una classe singleton:

  1. Fer privat un constructor.
  2. Escriu un mètode estàtic que tingui l'objecte de tipus retorn d'aquesta classe singleton. Aquí, el concepte d'inicialització Lazy s'utilitza per escriure aquest mètode estàtic.

Propòsit de la classe Singleton

L'objectiu principal d'una classe java Singleton és restringir el límit del nombre de creacions d'objectes a només un. Sovint, això garanteix que hi hagi control d'accés als recursos, per exemple, el sòcol o la connexió a la base de dades.



El malbaratament d'espai de memòria no es produeix amb l'ús de la classe singleton perquè restringeix la creació d'instàncies. Com que la creació de l'objecte només es farà una vegada en lloc de crear-lo cada vegada que es faci una nova sol·licitud.

Podem utilitzar aquest únic objecte repetidament segons els requisits. Aquesta és la raó per la qual les aplicacions multifils i de bases de dades fan servir principalment el patró Singleton a Java per a la memòria cau, registre, agrupació de fils, paràmetres de configuració i molt més.

Per exemple, hi ha una llicència amb nosaltres i només tenim una connexió de base de dades o suposem que el nostre controlador JDBC no ens permet fer multithreading, aleshores la classe Singleton entra a la imatge i s'assegura que a la vegada, només una connexió única. o un sol fil pot accedir a la connexió.

Com dissenyar/crear una classe Singleton a Java?

Per crear una classe singleton, hem de seguir els passos que es detallen a continuació:

1. Assegureu-vos que només existeix una instància de la classe.

2. Proporcioneu accés global a aquesta instància mitjançant

objecte de java
  • Declarant que tots els constructors de la classe són privats.
  • Proporciona un mètode estàtic que retorna una referència a la instància. El concepte d'inicialització mandrosa s'utilitza per escriure els mètodes estàtics.
  • La instància s'emmagatzema com a variable estàtica privada.

Un exemple de classes singleton és Classe d'execució, Servlet d'acció i Localitzador de serveis . Els constructors privats i els mètodes de fàbrica també són un exemple de la classe singleton.

Diferència entre Classe Normal i Classe Singleton

Podem distingir una classe Singleton de les classes habituals pel que fa al procés d'instanciació de l'objecte de la classe. Per instanciar una classe normal, utilitzem un constructor java. D'altra banda, per crear una instancia d'una classe singleton, utilitzem el mètode getInstance().

L'altra diferència és que una classe normal desapareix al final del cicle de vida de l'aplicació mentre que la classe singleton no es destrueix amb la finalització d'una aplicació.

Formes de patró de classe Singleton

Hi ha dues formes de patrons de disseny singleton, que són:

  • Instanciació primerenca: La creació de l'objecte té lloc en el moment de la càrrega.
  • Instanciació mandrosa: La creació d'objectes es fa segons el requisit.

Implementació: Vegem breument com varia la classe singleton de la classe normal a Java. Aquí la diferència és en termes d'instanciació, ja que per a la classe normal fem servir un constructor, mentre que per a la classe singleton fem servir el mètode getInstance(). que veurem a l'exemple 1 tal com es mostra a continuació. En general, per tal d'evitar confusions, també podem utilitzar el nom de la classe com a nom del mètode mentre definim aquest mètode que es mostrarà a l'exemple 2 de la següent manera.

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

>

>

Sortida

matrius en java
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>

Explicació de la sortida:

Classe Singleton

En una classe singleton, quan truquem per primera vegada al mètode getInstance(). , crea un objecte de la classe amb el nom single_instance i el retorna a la variable. Com que single_instance és estàtica, es canvia de nul a algun objecte. La propera vegada, si intentem cridar el mètode getInstance() ja que single_instance no és nul, es retornarà a la variable, en lloc de tornar a crear una instancia de la classe Singleton. Aquesta part es fa per condició if.

A la classe principal, instanciem la classe singleton amb 3 objectes x, y i z cridant l'estàtica mètode getInstance() . Però en realitat, després de la creació de l'objecte x, les variables y i z s'apunten a l'objecte x tal com es mostra al diagrama. Per tant, si canviem les variables de l'objecte x, això es reflecteix quan accedim a les variables dels objectes y i z. També si canviem les variables de l'objecte z, això es reflecteix quan accedim a les variables dels objectes x i y.

Ara hem acabat de cobrir tots els aspectes de l'exemple 1 i hem implementat el mateix, ara implementarem la classe Singleton amb el nom del mètode com el del nom de la classe.

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

>

>

Sortida

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>

Explicació: A la classe singleton, quan cridem per primera vegada al mètode Singleton(), es crea un objecte de la classe Singleton amb el nom single_instance i el retorna a la variable. Com que single_instance és estàtica, es canvia de nul a algun objecte. La propera vegada si intentem cridar el mètode Singleton(), ja que single_instance no és nul, es retorna a la variable, en lloc de tornar a crear una instancia de la classe Singleton.

Més informació: Tutorial de patrons de disseny de Java