Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Design Patterns en Java
  3. Le pattern Singleton
Extrait - Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception
Extraits du livre
Design Patterns en Java Descriptions et solutions illustrées en UML 2 et Java (5e édition) - Les 23 modèles de conception Revenir à la page d'achat du livre

Le pattern Singleton

Description

Le pattern Singleton a pour but d’assurer qu’une classe ne possède qu’une seule instance et de fournir une méthode de classe unique retournant cette instance.

Dans certains cas, il est utile de gérer des classes ne possédant qu’une seule instance. Dans le cadre des patterns de construction, nous pouvons citer le cas d’une fabrique de produits (pattern Abstract Factory) dont il n’est pas nécessaire de créer plus d’une instance.

Exemple

Dans le système de vente en ligne de véhicules, nous devons gérer des classes possédant une seule instance.

Le système de liasse de documents destinés au client lors de l’achat d’un véhicule (comme le certificat de cession, la demande d’immatriculation et le bon de commande) utilise la classe LiasseVierge qui ne possède qu’une seule instance. Cette instance référence tous les documents nécessaires pour le client. Cette instance unique est appelée la liasse vierge car les documents qu’elle référence sont tous vierges. L’utilisation complète de la classe LiasseVierge est expliquée dans le chapitre consacré au pattern Prototype.

La figure 2-6.1 illustre l’utilisation du pattern Singleton pour la classe LiasseVierge. L’attribut de classe instance contient soit null soit l’unique instance de la classe LiasseVierge. La méthode de classe Instance renvoie cette unique instance en retournant la valeur de l’attribut instance. Si cet attribut a pour valeur null, il est préalablement initialisé lors de la création de l’unique instance.

images/3figure8-1.png

Figure 2-6.1 - Le pattern Singleton appliqué à la classe LiasseVierge

Structure

1. Diagramme de classe

La figure 2-6.2 détaille la structure générique du pattern.

images/fig811.PNG

Figure 2-6.2 - Structure du pattern Singleton

2. Participant

Le seul participant est la classe Singleton qui offre l’accès à l’unique instance par sa méthode de classe Instance.

Par ailleurs, la classe Singleton possède un mécanisme qui assure qu’elle ne peut posséder au plus qu’une seule instance. Ce mécanisme bloque la création d’autres instances.

3. Collaboration

Chaque client de la classe Singleton accède à l’unique instance par la méthode de classe Instance. Il ne peut pas créer de nouvelles instances en utilisant l’opérateur habituel d’instanciation (opérateur new) qui est bloqué.

Domaine d’utilisation

Le pattern est utilisé dans le cas suivant :

  • Il ne doit y avoir qu’une seule instance d’une classe.

  • Cette instance ne doit être accessible qu’au travers d’une méthode de classe.

L’utilisation du pattern Singleton offre également la possibilité de ne plus utiliser de variables globales.

Exemples en Java

1. La liasse vierge

Le code Java complet de la classe LiasseVierge est donné dans le chapitre du pattern Prototype. La partie de cette classe relative à l’utilisation du pattern Singleton est fournie à la suite.

Le constructeur de cette classe a une visibilité privée afin que seule la méthode Instance puisse l’utiliser. Ainsi, aucun objet externe à la classe LiasseVierge ne peut en créer d’instance en utilisant l’opérateur new.

De la même façon, l’attribut _instance détient également une visibilité privée pour que l’accès ne soit possible que depuis la méthode de classe Instance.

import java.util.*; 
public class LiasseVierge extends Liasse 
{ 
  private static LiasseVierge _instance = null; 
 
  private LiasseVierge() 
  { 
    documents = new ArrayList<Document>(); 
  } 
 
  public static LiasseVierge Instance() 
  { 
    if (_instance == null) 
      _instance = new LiasseVierge(); 
    return _instance; 
  } 
 
  ... 
 
} 

Le seul client de la classe LiasseVierge est la classe LiasseClient qui, dans son constructeur...