|
Publié le par Davy CLAISSE

Pattern Singleton

Implémentation du pattern en Java Singleton (avec le mot-clef Synchronized)

Attention : cet article est une des implémentations possibles du design pattern Singleton en Java. Cette implémentation est fournie à titre d'exemple mais fait partie de celle à éviter.

La liste des implémentations possibles en Java est accessible en bas de cette page.

Caractéristiques de cette implémenation :

  • [OK] Une seule et unique instance pour toute l'application.
  • [OK] Gestion des accès multi-threads.
  • [OK] Instanciations extérieures impossibles.
  • [KO] Chargement / Récupération rapide de l'instance.
  • [OK] Instanciation seulement à la première invocation.

Diagramme de classes

Diagramme de classes Singleton synchronized

Implémentation


public class MySingleton {
    /**
     * L'instance est 'static' afin d'être unique.
     */
    private static MySingleton INSTANCE;

    /**
     * Le constructeur est privé afin d'éviter que d'autres classes puissent
     * instancier un objet de cette classe.
     */
    private MySingleton() {
    }

    /**
     * Cette méthode permet de récupérer l'instance du singleton. Cependant,
     * si le mot-clef 'synchronized' est indispensable afin de gérer la
     * création de l'instance dans le cas d'appels multi-threads, il devient
     * coûteux et inutile dès que l'instance est créée.
     */
    public static synchronized MySingleton getInstance() {
        if (MySingleton.INSTANCE == null) {
            MySingleton.INSTANCE = new MySingleton();
        }

        return MySingleton.INSTANCE;
    }

    // Exemple d'utilisation
    public static void main(String... args) {
        MySingleton a, b;

        a = MySingleton.getInstance();  // L'instance est créée.
        b = MySingleton.getInstance();  // La première instance est retournée

        System.out.println(a == b);     // Références identiques => affiche 'true'
    }
}