Le pattern singleton est un design pattern qui garantit qu'une classe possède une seule instance et offre un point d'accès centralisé. En Python, il offre plusieurs avantages clés pour la conception logicielle.
Les principaux bénéfices sont :
- Optimisation des ressources : En limitant la création d'objets répétitifs, il réduit la consommation mémoire et les charges de calcul.
- Cohérence dans les environnements concurrents : Il assure une initialisation unique des variables globales, évitant les conflits de données en contexte multithread.
- Contrôle d'accès simplifié : Il fournit un mécanisme d'accès uniforme, permettant une gestion centralisée de l'instance.
Implémentation de base du singleton
class InstanceUnique:
_instance_singuliere = None
def __new__(cls, *args, **parametres):
if cls._instance_singuliere is None:
cls._instance_singuliere = super().__new__(cls)
return cls._instance_singuliere
def __init__(self):
# Logique d'initialisation personnalisée
pass
# Test de l'unicité
objet_a = InstanceUnique()
objet_b = InstanceUnique()
print(objet_a is objet_b) # Affiche True
Cas d'usage : Configuration du driver Appium
Dans les applications utilisant Appium, le singleton peut centraliser la configuration du webdirver. L'exemple suivant montre une classe qui charge un fichier YAML pour initialiser un driver distant unique.
# config_pilote.py
import os.path
from appium import webdriver
from config import utilitaire_yaml
from config.chemins import chemin_projet
class ConfigPilote(object):
_instance_unique = None
def __new__(cls, *args, **parametres):
if not hasattr(cls, '_instance_unique'):
parent = super(ConfigPilote, cls)
chemin_fichier = os.path.join(chemin_projet, "config\config.yaml")
donnees = utilitaire_yaml.lire_configuration_yaml(chemin_fichier)
cls._instance_unique = parent.__new__(cls)
cls._instance_unique.moteur = webdriver.Remote(
"http://127.0.0.1:4723/wd/hub", donnees["capacites_souhaitees"]
)
return cls._instance_unique
class ClientPilote(ConfigPilote):
def recuperer_moteur(self):
return self.moteur
La méthode __new__ vérifie l'existence d'une instance via hasattr. Si aucune instance n'existe, elle charge les données du fichier YAML, crée un objet unique et initialise le moteur webdriver avec les paramètres spécifiés. Cette approche garantit que toutes les composantes de l'application partagent la même connexion au serveur Appium, assurant ainsi la cohérence et évitant les redodnances.