2011-04-02 3 views
0

Quand j'ai été présenté au modèle singleton, ce fut la façon de la mettre en œuvre:différentes implémentations Singelton

public class MySingleton 
{ 
    private MyStingleton instance; 

    private MySingleton() 
    { 
     //constructor 
    } 

    public static MySingleton GetInstance() 
    { 
     if(instance== null) 
     { 
      instance = new MySingleton();  
     } 
     return instance; 
    } 
} 

Quel est l'avantage de le faire de cette façon, par rapport à ceci:

public class MySingleton 
{ 
    public static readonly MyStingleton Instance = new MySingleton(); 

    private MySingleton() 
    { 
     //constructor 
    } 

} 
+2

Que diriez-vous de "éviter les données globales, les conceptions non testables, les dépendances cachées, et coupler chaque classe de votre application à un Singleton"? Regardez dans l'injection de dépendance à la place. – TrueWill

Répondre

4

Le premier exemple n'est pas thread-safe. Vous pouvez jeter un oeil à la following article.

2

Ces deux implémentations singleton sont dangereuses, et je ne vois aucun avantage à utiliser le second sur le premier.

Vous devriez probablement vérifier ce lien: http://www.yoda.arachsys.com/csharp/singleton.html où un certain nombre d'implémentations singleton est répertorié, pour chacun est expliqué pourquoi ils sont bons ou mauvais.

singleton finale correcte est la suivante:

public sealed class Singleton 
{ 
    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      return Nested.instance; 
     } 
    } 

    class Nested 
    { 
     // Explicit static constructor to tell C# compiler 
     // not to mark type as beforefieldinit 
     static Nested() 
     { 
     } 

     internal static readonly Singleton instance = new Singleton(); 
    } 
} 
+2

S'il vous plaît noter qu'il existe un lien en haut à une version mise à jour de l'article, avec un motif supplémentaire en utilisant 'Lazy '. –

+0

Qu'est-ce qui n'est pas sûr pour les threads dans le second? Ça a l'air bien ... –

+0

Hey Jon, j'ai raté ce lien moi-même, c'est une très belle fonctionnalité dans .NET4.0. Toujours amusant d'en savoir plus en répondant aux questions :). @Petar ah ça pourrait être oui, peut-être que je l'ai confondu avec instance = null au lieu de instance = new (..) ce qui serait dangereux. –

2

Dans la première, l'instance ne se crée pas jusqu'à ce que vous appelez la méthode statique GetInstance. vous créez l'instance juste quand vous appelez cette méthode.

Dans le second, l'instance est une constante, est conceptuellement différente.

utilisé pour utiliser le premier, est le modèle que j'ai toujours vu, et vous pouvez contrôler quand l'instance est créée.

Questions connexes