📝 Ce que vous apprendrez

  • Qu'est-ce que le modèle Singleton ?
  • Quand et pourquoi l'utiliser ?
  • Comment l'implémenter en Java
  • Pièges et bonnes pratiques

🔍 Qu'est-ce que le modèle Singleton ?

Le modèle Singleton garantit qu'une classe n'a qu'une seule instance et fournit un point d'accès global à celle-ci.

Il s'agit d'un centre de commande unique ou unité de contrôle dans une application.

🎯 Quand faut-il utiliser Singleton ?

Utilisez Singleton lorsque :

  • Il ne doit exister qu'une seule instance d'une classe (par exemple, journalisation, configuration, cache).
  • Vous avez besoin d'un point d'accès centralisé et global
  • Vous souhaitez contrôler l'accès aux ressources partagées

🧱 Comment implémenter un Singleton en Java

✅ Initialization Eager (Thread-safe)

public class ConfigManager {
    private static final ConfigManager instance = new ConfigManager();

    private ConfigManager() {}

    public static ConfigManager getInstance() {
        return instance;
    }
}

✅ Initialisation paresseuse (sécurisée par la synchronisation)

public class Logger {
    private static Logger instance;

    private Logger() {}

    public static synchronized Logger getInstance() {
        if (instance == null) {
            instance = new Logger();
        }
        return instance;
    }
}

✅ Meilleure pratique : Verrouillage doublement vérifié

public class DBConnection {
    private static volatile DBConnection instance;

    private DBConnection() {}

    public static DBConnection getInstance() {
        if (instance == null) {
            synchronized (DBConnection.class) {
                if (instance == null) {
                    instance = new DBConnection();
                }
            }
        }
        return instance;
    }
}

🧪 Analogie avec le monde réel

Imaginez que votre application dispose d'un Print Spooler. Si deux utilisateurs impriment en même temps, vous ne voulez pas que deux spoolers gèrent les travaux d'impression - vous voulez un gestionnaire central : le Singleton.

⚠️ Les pièges à éviter

  • ❌ Surutiliser Singleton comme une variable globale
  • ❌ Rupture de la testabilité (couplage étroit)
  • ❌ Ne pas le rendre thread-safe dans les environnements multithreads

✅ Meilleures pratiques

  • Garder le constructeur privé
  • Assurer lazy ou eager initialization en fonction des besoins de performance
  • Utilisez enum pour un Singleton simple et sûr (bonus) :
public enum AppSettings {
    INSTANCE;

    public void load() { ... }
}

📘 Recap

  • Le singleton limite l'instanciation à un seul objet
  • Utile pour l'état ou la coordination globale
  • Java propose plusieurs façons de l'implémenter sans risque pour les threads
  • Enum Singleton = solution simple et sûre