Aller au contenu

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.


Voir aussi