logo

Modèle de conception de méthode Singleton en Java

En programmation orientée objet, une classe java singleton est une classe qui ne peut avoir qu'un seul objet (une instance de la classe) à la fois. Après la première fois, si l'on tente d'instancier les classes Java Singleton, la nouvelle variable pointe également vers la première instance créée. Ainsi, quelles que soient les modifications que nous apportons à n'importe quelle variable à l'intérieur de la classe via n'importe quelle instance, elles affectent la variable de l'instance unique créée et sont visibles si nous accédons à cette variable via n'importe quelle variable de ce type de classe défini.

N'oubliez pas les points clés lors de la définition d'une classe en tant que classe singleton et lors de la conception d'une classe singleton :



  1. Rendre un constructeur privé.
  2. Écrivez une méthode statique qui a l'objet de type de retour de cette classe singleton. Ici, le concept d'initialisation paresseuse est utilisé pour écrire cette méthode statique.

Objectif de la classe Singleton

L'objectif principal d'une classe Java Singleton est de limiter la limite du nombre de créations d'objets à une seule. Cela garantit souvent qu'il existe un contrôle d'accès aux ressources, par exemple, une connexion à un socket ou à une base de données.

types de réseau

Le gaspillage d'espace mémoire ne se produit pas avec l'utilisation de la classe singleton car elle restreint la création d'instances. Comme la création de l'objet n'aura lieu qu'une seule fois au lieu de la créer à chaque nouvelle demande.

Nous pouvons utiliser cet objet unique à plusieurs reprises selon les exigences. C'est la raison pour laquelle les applications multithread et de base de données utilisent principalement le modèle Singleton en Java pour la mise en cache, la journalisation, le pooling de threads, les paramètres de configuration et bien plus encore.



Par exemple, nous avons une licence chez nous et nous n'avons qu'une seule connexion à la base de données ou supposons que notre pilote JDBC ne nous permet pas de faire du multithreading, alors la classe Singleton entre en scène et s'assure qu'à la fois, une seule connexion ou un seul thread peut accéder à la connexion.

Comment concevoir/créer une classe Singleton en Java ?

Pour créer une classe singleton, nous devons suivre les étapes ci-dessous :

1. Assurez-vous qu’une seule instance de la classe existe.



2. Fournissez un accès global à cette instance en

  • Déclarer que tous les constructeurs de la classe sont privés.
  • Fournir une méthode statique qui renvoie une référence à l'instance. Le concept d'initialisation paresseuse est utilisé pour écrire les méthodes statiques.
  • L'instance est stockée en tant que variable statique privée.

Un exemple de classes singleton est Classe d'exécution, servlet d'action et localisateur de services . Les constructeurs privés et les méthodes d'usine sont également un exemple de classe singleton.

Différence entre la classe normale et la classe Singleton

On peut distinguer une classe Singleton des classes habituelles par rapport au processus d'instanciation de l'objet de la classe. Pour instancier une classe normale, nous utilisons un constructeur Java. D'autre part, pour instancier une classe singleton, nous utilisons la méthode getInstance().

L'autre différence est qu'une classe normale disparaît à la fin du cycle de vie de l'application alors que la classe singleton ne se détruit pas à la fin de l'application.

Formes de modèle de classe Singleton

Il existe deux formes de modèles de conception singleton, à savoir :

  • Instanciation précoce : La création de l'objet a lieu au moment du chargement.
  • Instanciation paresseuse : La création de l'objet se fait selon le besoin.

Mise en œuvre: Voyons brièvement comment la classe singleton diffère de la classe normale en Java. Ici, la différence est en termes d'instanciation puisque pour la classe normale nous utilisons un constructeur, alors que pour la classe singleton nous utilisons le Méthode getInstance() que nous examinerons dans l’exemple 1, comme illustré ci-dessous. En général, afin d'éviter toute confusion, nous pouvons également utiliser le nom de classe comme nom de méthode lors de la définition de cette méthode qui sera décrite dans l'exemple 2 ci-dessous comme suit.

Exemple 1:

Java


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

>

>

Sortir

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>

Explication de la sortie :

Classe Singleton

Dans une classe singleton, lorsque nous appelons pour la première fois le Méthode getInstance() , il crée un objet de la classe avec le nom single_instance et le renvoie à la variable. Puisque single_instance est statique, il passe de null à un objet. La prochaine fois, si nous essayons d'appeler la méthode getInstance() puisque single_instance n'est pas null, elle est renvoyée à la variable, au lieu d'instancier à nouveau la classe Singleton. Cette partie est réalisée par condition if.

Dans la classe principale, nous instancions la classe singleton avec 3 objets x, y et z en appelant le static méthode getInstance() . Mais en réalité, après la création de l’objet x, les variables y et z pointent vers l’objet x comme le montre le diagramme. Par conséquent, si nous modifions les variables de l’objet x, cela se reflète lorsque nous accédons aux variables des objets y et z. De plus, si nous modifions les variables de l'objet z, cela se reflète lorsque nous accédons aux variables des objets x et y.

Maintenant que nous avons fini de couvrir tous les aspects de l'exemple 1 et que nous avons implémenté la même chose, nous allons maintenant implémenter la classe Singleton avec le nom de la méthode comme celui 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);> >}> }>

>

héritage en C++
>

Sortir

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>

Explication: Dans la classe singleton, lorsque nous appelons pour la première fois la méthode Singleton(), elle crée un objet de classe Singleton avec le nom single_instance et le renvoie à la variable. Puisque single_instance est statique, il passe de null à un objet. La prochaine fois, si nous essayons d'appeler la méthode Singleton(), puisque single_instance n'est pas nul, elle est renvoyée à la variable, au lieu d'instancier à nouveau la classe Singleton.

Lire plus : Tutoriel sur les modèles de conception Java