Le pattern Singleton

Le pattern Singleton est un patron de conception (design pattern) utilisé en génie logiciel qui a pour objectif de restreindre l'instanciation d'une classe à un seul objet (ou instance).

Mar 19, 2024
Le pattern Singleton est un patron de conception (design pattern) utilisé en génie logiciel qui a pour objectif de restreindre l'instanciation d'une classe à un seul objet (ou instance). Cela est particulièrement utile lorsque l'on a besoin d'une seule instance pour coordonner des actions à travers un système.
Voici comment le Singleton fonctionne et ses principales caractéristiques :
  1. Contrôle d'accès unique : Le Singleton assure qu'une seule instance de la classe est créée dans l'ensemble du programme. Cela est souvent réalisé en cachant le constructeur de la classe pour empêcher la création d'objet par les méthodes habituelles.
 
  1. Accès global : L'instance unique du Singleton est généralement accessible globalement, ce qui permet d'accéder facilement à l'instance sans avoir à la passer en tant que paramètre à travers l'application.
  1. Initialisation paresseuse (Lazy Initialization) : Souvent, le Singleton est instancié lors de sa première utilisation, ce qui permet de réduire la charge de mémoire et d'améliorer les performances de l'application lors du démarrage.

Utilisations du Singleton

  • Gestion des ressources : Pour gérer les accès à une ressource partagée dans une application, comme une connexion à une base de données ou un fichier de log.
  • Configuration : Pour stocker la configuration de l'application que l'on souhaite accessible globalement sans avoir à instancier de multiples objets de configuration.
  • Gestion de cache : Lorsqu'on a besoin d'un cache unique à travers l'application pour stocker et réutiliser des données coûteuses à obtenir.
  • Gestion des drivers : Dans les systèmes où les drivers doivent être uniques, comme dans certaines applications matérielles ou de bas niveau.

Sont schémas UML

notion image
Le diagramme UML suivant dépeint un exemple classique du pattern Singleton :
  • Singleton Class : C'est la classe qui implémente le pattern Singleton. Elle contient une méthode statique (par exemple, getInstance()) qui permet d'accéder à l'unique instance de la classe. Le constructeur de cette classe est privé pour empêcher l'instanciation directe.
  • Instance : Il s'agit de l'unique instance de la classe Singleton. Cette instance est privée et statique au sein de la classe Singleton.
  • La méthode getInstance() retourne l'attribut instance cette méthode contrôle l'accès à l'instance de la classe Singleton.
  • Le constructeur Singleton() est privé, ce qui empêche l'instanciation externe.

Exemple de code

Java

Voici un exemple simple de mise en œuvre d'un Singleton en Java :
public class Singleton { private static Singleton instance; private Singleton() {} // Constructeur privé pour empêcher l'instanciation public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
Dans cet exemple, l'instance est créée la première fois que getInstance() est appelée. Cette technique assure que seulement une instance de la classe Singleton est créée et accessible dans toute l'application.
Voici comment vous pouvez implémenter le pattern Singleton en Python et en Ruby, en tenant compte des spécificités de chaque langage.

Python

En Python, une manière courante d'implémenter le pattern Singleton est d'utiliser une classe avec une méthode de classe qui contrôle l'accès à l'unique instance. L'exemple suivant illustre cette approche :
class Singleton: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super(Singleton, cls).__new__(cls) # Initialisation de l'instance peut être faite ici return cls._instance # Utilisation du Singleton singleton_instance = Singleton() another_instance = Singleton() # Ces deux instances sont en fait la même assert singleton_instance is another_instance
Dans cet exemple, l'utilisation de __new__ permet de contrôler la création d'instances. __new__ est appelé automatiquement avant __init__, et il est responsable de retourner une nouvelle instance de la classe. En surchargeant cette méthode, on peut s'assurer que seulement une instance de la classe est créée.

Ruby

En Ruby, le pattern Singleton peut être implémenté manuellement, similaire à Python, ou en utilisant le module Singleton fourni par la bibliothèque standard de Ruby, ce qui simplifie l'implémentation. Voici comment vous pouvez l'utiliser :
require 'singleton' class SingletonExample include Singleton end instance = SingletonExample.instance another_instance = SingletonExample.instance # Ces deux instances sont identiques puts instance == another_instance
Lorsque vous incluez le module Singleton dans une classe, Ruby s'occupe de rendre le constructeur privé et de fournir une méthode de classe .instance qui retourne l'unique instance de la classe. Cela garantit que vous ne pouvez pas créer de nouvelles instances en utilisant new et que vous accédez toujours à la même instance via SingletonExample.instance.
Ces exemples montrent comment le pattern Singleton peut être implémenté de manière concise et sûre dans Python et Ruby, exploitant les caractéristiques et facilités fournies par chaque langage.

Avantages et Inconvénients

Avantages :
  • Assure qu'une classe n'a qu'une seule instance.
  • Offre un point d'accès global à cette instance.
  • Peut contribuer à économiser des ressources.
Inconvénients :
  • Peut introduire un point de défaillance global dans l'application.
  • L'usage global peut rendre les tests plus difficiles, car il introduit un état partagé entre les tests.
  • Peut être difficile à utiliser dans un environnement multi-thread sans précautions supplémentaires pour assurer la thread-sécurité.