Qu'est-ce qu'un Singleton ?

Le Singleton est un motif de conception ("design pattern" en anglais) couramment utilisé en programmation.

Ce concept n'est pas propre à un langage de programmation spécifique mais est utilisé dans de nombreux langages, y compris Java, C#, et bien sûr Python.

L'idée principale derrière le Singleton est de restreindre la création d'une classe à une seule instance et de fournir un point d'accès global à cette instance. Cette approche est particulièrement utile dans les cas où une classe contrôle l'accès à une ressource partagée, comme une connexion à une base de données ou un fichier de configuration.

Concept Général

Le Singleton assure qu'une classe n'a qu'une seule instance et fournit un point d'accès global à cette instance.

Cela est généralement accompli de différentes façons :

  • En rendant le constructeur de la classe privé pour empêcher la création d'instances de l'extérieur.

  • En fournissant une méthode statique qui agit comme constructeur. Cette méthode crée une instance de la classe si elle n'existe pas encore et la retourne.

Le singleton en Python

Python, étant un langage flexible et dynamique, il offre différentes façons d'implémenter le motif Singleton.

Il existe d'ailleurs plusieurs Singleton de base bien connus dans le langage comme les objets None ou encore les booléens True et False.

Vous pouvez faire le test en entrant dans un interpréteur Python pour vérifier l'identifiant unique en mémoire de ces objets avec la fonction id et remarquer qu'il sera toujours le même et ce, même si vous essayez de créer une nouvelle variable :

>>> id(None)
4366508440
>>> id(None)
4366508440
>>> nouveau_none = None
>>> id(nouveau_none)
4366508440

Création d'un Singleton en Python

Nous ne sommes heureusement pas limités aux singletons natifs de Python. Il est en effet possible de créer son propre Singleton.

On peut créer un Singleton en Python en utilisant la méthode __new__, qui permet de contrôler la création d'un objet :

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance
Un instant

La méthode __new__ est redéfinie pour vérifier si une instance existe déjà. Si ce n'est pas le cas, elle en crée une nouvelle. Sinon, elle retourne l'instance existante.

Cas d'Usage

Un cas d'usage courant du motif Singleton est la gestion de connexions à une base de données. Dans une application, il est souvent nécessaire de n'avoir qu'une seule instance de connexion pour éviter les problèmes de performance liés à l'ouverture de multiples connexions. En utilisant le Singleton, on assure que la classe de connexion ne peut être instanciée qu'une seule fois, garantissant ainsi l'utilisation efficace des ressources et simplifiant la gestion des connexions.

Le motif Singleton est un outil puissant pour certaines situations, mais il doit être utilisé avec prudence. Son utilisation inappropriée peut rendre le code difficile à tester et à maintenir, notamment à cause de son caractère global et de l'accès non restreint à l'instance singleton.

Rechercher sur le site

open_in_new

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.