Java — Singleton Pattern (Instance unique)
Le Singleton Pattern est un design pattern qui garantit qu’une classe n’a qu’une seule instance dans toute l’application.
1. Idée simple
Une seule instance accès global à cette instance
2. Implémentation basique
class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
Problème :
- ❌ pas thread-safe
3. Problème en multithreading
Deux threads peuvent créer deux instances différentes
💥 bug critique
4. Version thread-safe (synchronized)
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
safe plus lent
5. Double-checked locking (optimisé)
class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
performant thread-safe
💎 6. Meilleure version (recommandée)
Singleton avec enum
enum Singleton {
INSTANCE;
}
Avantages
- thread-safe automatiquement
- protège contre la sérialisation
- protège contre la réflexion
7. Quand utiliser ?
- configuration globale
- logger
- cache
- connexion unique
8. Pièges fréquents
- singleton global = couplage
- difficile à tester
- abus de singleton
9. Singleton vs DI
| Singleton | DI | |
|---|---|---|
| instance | unique globale | gérée par container |
| flexibilité | faible | élevée |
| test | difficile | facile |
10. Questions classiques
Q1
objectif du Singleton ? une seule instance
Q2
problème principal ? thread-safety
Q3
meilleure implémentation ? enum
À retenir
- Singleton = instance unique
- attention au multi-thread
- enum = solution moderne
- ne pas en abuser
🧾 En résumé
- garantit une seule instance
- accès global
- nécessite une implémentation correcte
- peut créer du couplage
Le Singleton est puissant, mais doit être utilisé avec précaution.