Singleton en programmation orientée objet

Le Singleton est un patron de conception qui garantit qu’une classe n’a qu’une seule instance durant l’exécution d’un programme, tout en fournissant un point d’accès global à cette instance.

À utiliser avec précaution

Bien qu’utile pour des ressources partagées (connexion BDD, logger, cache), le Singleton introduit un état global, ce qui peut nuire à la testabilité, à la modularité et à la clarté du code.
Dans les architectures modernes (ex. : applications avec injection de dépendances), il est souvent préférable de gérer l’unicité au niveau du conteneur, pas dans la classe elle-même.

Alternative moderne (recommandée)

Dans une application utilisant un conteneur d’injection de dépendances (ex. : Symfony, Laravel, ou un PSR-11 simple), on préfère souvent :

// Dans le conteneur
$container->set(ConfigManager::class, fn () => new ConfigManager());

// Dans le code
$config = $container->get(ConfigManager::class);

Un conteneur (ou container) est un outil qui dit :

« Quand on me demande tel type d’objet, je le crée une seule fois, puis je le réutilise. »

Étape 1 : Enregistrement

$container->set(ConfigManager::class, fn () => new ConfigManager());

Cela veut dire :
« Chaque fois qu’on te demandera un ConfigManager, crée-le une seule fois, puis garde-le en mémoire. »

Étape 2 : Utilisation

// Dans le code
$config = $container->get(ConfigManager::class);

Cela veut dire :
« Donne-moi l’instance de ConfigManager (déjà créée ou créée à la première demande). »

Singleton vs Conteneur : la différence clé

SingletonConteneur
AccèsConfigManager::getInstance()global, fixe$container->get(...)injecté, flexible
TestabilitéTrès difficile (on ne peut pas facilement « simuler » la config)Facile (on injecte un faux ConfigManager en test)
CouplageLe code dépend directement de la classe ConfigManagerLe code dépend d’une interface ou d’un contrat (meilleure séparation)
Philosophie« Je vais chercher moi-même mon outil »« On me donne l’outil dont j’ai besoin »

Analogie simple

  • Singleton = aller chercher la seule cafetière de l’entreprise directement dans la cuisine.
    Tout le monde sait qu’elle existe, mais si elle tombe en panne, tout le monde est bloqué.
    → Et en test ? Vous ne pouvez pas la remplacer par une tasse d’eau chaude !
  • Conteneur = votre manager vous apporte une tasse de café quand vous en avez besoin.
    → Vous ne savez pas d’où il vient (machine A, B, ou thé ?).
    → En réunion importante ? Il vous apporte du déca.
    → En test ? Il vous donne de l’eau chaude → vous testez sans caféine !

Beaucoup de petits projets utilisent des Singletons ou des new directs.
Mais dès que le projet grandit, ou qu’on veut tester sérieusement, la séparation devient indispensable.

Explorer les thématiques : Développement & technologies
Les contenus de définition restent publics. Les ressources (outils, grilles, supports) liées à cette fiche sont disponibles dans l’espace membre.

Plus de publications