Discuter:Singleton (patron de conception)

Un article de Wikipédia, l'encyclopédie libre.

L'exemple Java avec double-checked locking n'est pas correcte (cf. http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html). Une solution appliquée au singleton :

 public class Singleton {
     private static volatile Singleton INSTANCE = null;
     private Singleton() {}
     public static Singleton getInstance() {
         if (INSTANCE == null) {
             synchronized(Singleton.this) {
                 if (INSTANCE == null) {
                     INSTANCE = new Singleton();
                 }
             }
         }
         return INSTANCE;
     }
 }

Une autre solution est possible pour l'implémentation du Singleton en JAVA :

public class MonSingleton {
   /**
    * Initialisation de l’instance unique par le classloader
    * Evite les problèmes de multi-threading
    */
    static {
        m_instance = new MonSingleton();
    }
    
    /**
     * Instance unique
     */
    private static MonSingleton m_instance;
    
    /**
      * Constructeur unique et private pour éviter la construction d’autres objet
     */
    private MonSingleton(){
        …
    }
    
    /**
     * Méthode pour l’acces à l’instance unique
     */
    public final static MonSingleton getInstance(){
        return m_instance();
    }
}

le but est de restreindre l'instanciation d'une classe à un seul objet (ou bien quelques objets seulement)

Un singleton n'est pas un quelquleton.Webpac 28 mai 2006 à 21:46 (CEST)

[modifier] L'implémentation C++ n'est pas correcte en cas d'utilisation de DLL

Comme précisé dans la version anglaise de l'article, chaque DLL qui utilise le singleton aura sa propre instance. Je n'ai jamais travaillé avec les librairies dynamiques d'autres systèmes d'exploitation que Windows, mais je suppose que le problème est le même... Accessoirement, je n'ai jusqu'à maintenant trouvé aucune solution élégante pour résoudre le problème. Une solution est de ne pas utiliser de classe template, en tout cas pas pour la fonction qui renvois l'instance, car il faut qu'elle soit implémentée dans le .cpp d'une DLL.