Générique Singleton<T>
J'ai une question, est-ce la bonne approche pour faire un Générique Singleton?
public class Singleton<T> where T : class, new()
{
private static T instance = null;
private Singleton() { }
public static T Instancia
{
get
{
if (instance == null)
instance = new T();
return instance;
}
}
}
EDIT:
La vérification de certains documents Pdf, j'ai trouvé un générique Singleton fait de cette façon d'autres, est-ce que d'autres correct?
public class Singleton<T> where T : class, new()
{
Singleton() { }
class SingletonCreator
{
static SingletonCreator() { }
//Private object instantiated with private constructor
internal static readonly T instance = new T();
}
public static T UniqueInstance
{
get { return SingletonCreator.instance; }
}
}
Si votre but c'est de mettre en œuvre une sorte de Service Locator, alors ne le faites pas: blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
vous ne pouvez pas nouveau en place d'un singleton. c'est le point. et la raison de votre générique singleton implémentations ne le sont pas. les singletons.
vous ne pouvez pas nouveau en place d'un singleton. c'est le point. et la raison de votre générique singleton implémentations ne le sont pas. les singletons.
OriginalL'auteur MRFerocius | 2010-02-23
Vous devez vous connecter pour publier un commentaire.
Le problème avec un générique de singleton, factory est que depuis qu'il est générique, vous ne contrôlez pas le "singleton" type instancié de sorte que vous ne peut jamais garantir que l'instance que vous créez sera la seule instance de l'application.
Si un utilisateur peut fournir un type comme un argument de type générique, puis ils peuvent également créer des instances de ce type. En d'autres termes, vous ne pouvez pas créer un générique de singleton, factory - il sape le modèle lui-même.
Je ne suis pas sûr de ce que vous voulez dire - pourriez-vous poser votre question d'une manière différente?
Eh bien, vous pouvez faire les constructeurs protégés et de rendre le modèle de classe d'un ami. Alors seulement le Singleton-classe peut faire des instances. Oups, je ne sais pas si des amis existe en C#, a été pensée de C++.
Est est vrai que le type a fait un singleton pourrait avoir à l'intérieur un constructeur mais cela ne ferait que garantir que le type était un singleton à l'extérieur de l'assemblage en cours. Vous ne pouvez pas créer un vrai singleton cette manière que les autres types de la même assemblée peut créer des instances de l'singleton de type tout aussi facilement.
'singleton usine à sons similaires comme" numéro unique duplicateur " pour moi...
OriginalL'auteur Andrew Hare
c'est mon point de vue à l'aide .NET 4
Modèle d'utilisation:
OriginalL'auteur Alexandr
Voici ma mise en œuvre à l'aide d'un non-public constructeur. Le seul problème actuellement est qu'il n'ya pas de moyen d'avoir un custom contrainte sur C# génériques, donc je dois jeter une exception d'exécution pour les classes dérivées publique avec les constructeurs par défaut au lieu d'une erreur de compilation.
OriginalL'auteur Chris Shepley
Vous pouvez faire un singleton de la classe de base à l'aide d'un peu de triche (réflexion).
Vous pouvez (run-time) appliquer une classe ne possède pas de constructeur public.
OriginalL'auteur Wesley
Pour un morceau de code générique qui seront réutilisés, vous devriez envisager de fil de sécurité à l'endroit où vous créez l'instance du singleton.
Comme il est,
(instance == null)
pourrait true sur des threads séparés.Plaider la mauvaise conduite, car il existe de mauvais comportement est très très pauvre.
Je ne pense pas que c'est de préconiser un mauvais comportement. La plupart des applications n'ont pas besoin d'être thread-safe, il n'est donc pas toujours la peine de cycles pour s'assurer qu'il est sans cette exigence. C'est subjectif. Dire qu'une solution est mauvaise, parce qu'elle n'a pas de compte pour une utilisation que la plupart des gens n'ont pas n'est pas nécessairement valide.
vaut les cycles" il semble prématuré d'optimisation pour moi. Lorsque le thread de sécurité est facile à ajouter que c'est dans ce cas, un petit morceau de code générique, pourquoi pas?
Je commentais plus sur la philosophie que l'existant mauvais comportement permet à d'autres de répéter les comportements que les conseils pour cette question particulière.
OriginalL'auteur xyz
Noter que
OriginalL'auteur Ehsan Shirvan
Ce que j'ai fait, en utilisant le modèle Actuel (également thread-safe initialisation)
Utilisation:
Consommer le singleton:
OriginalL'auteur MaurGi
Il est possible, sans réflexion.
Nous avons juste besoin d'une classe générique pour le pattern singleton qui prend deux paramètres de la mise en œuvre du béton de classe de singleton et l'interface pour le béton singleton.
Le générique de la classe singleton implémente le pattern singleton et tous les trucs que vous avez besoin - par exemple, la journalisation, de serrures ou de quoi d'autre.
OriginalL'auteur Monotomy