Generische Singleton<T>
Ich habe eine Frage, ist das der richtige Ansatz, um die Herstellung einer Generischen 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:
Überprüfung einige PDF-Dateien fand ich eine generische Singleton gemacht dieses anderen Weise, ist das andere richtig?
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; }
}
}
Wenn Ihr Ziel ist zu implementieren eine Art von Service Locator, dann nicht: blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx
Sie können nicht von neuen ein singleton. das ist der Punkt. und der Grund Ihrer generischen singleton-Implementierungen nicht. singletons.
Sie können nicht von neuen ein singleton. das ist der Punkt. und der Grund Ihrer generischen singleton-Implementierungen nicht. singletons.
InformationsquelleAutor MRFerocius | 2010-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem mit einer generischen singleton-factory ist, dass seit es ist generisch, Sie haben keine Kontrolle über die "singleton" type instanziiert wird, so dass Sie nie garantieren können, dass die Instanz, die Sie erstellen, wird die einzige Instanz in der Anwendung.
Wenn ein user kann ein Typ als eine generische typargument dann können Sie auch erstellen von Instanzen dieses Typs. In anderen Worten, Sie können nicht erstellen Sie eine generische singleton-factory - es untergräbt das Muster selbst.
Ich bin mir nicht sicher, was du meinst - könntest du bitte deine Frage in einer anderen Art und Weise?
Auch Sie können die Konstruktoren geschützt und stellen Sie die template-Klasse einen Freund. Dann nur noch die Singleton-Klasse können Instanzen machen. Oops, ich weiß nicht, ob Freunde existiert in C#, dachte an C++.
Ist ist wahr, dass die Art ein singleton-könnte eine interne Konstruktor, aber das würde nur garantieren, dass der Typ ein singleton außerhalb der aktuellen assembly. Sie können nicht erstellen Sie eine wahre singleton diese Weise, wie andere Typen in der selben assembly erstellen Sie Instanzen der singleton-Typ nur als leicht.
"singleton factory' klingt ähnlich wie 'eindeutige Nummer duplicator" für mich...
InformationsquelleAutor Andrew Hare
dies ist mein Punkt mit .NET 4
Nutzungsmuster:
InformationsquelleAutor Alexandr
Hier ist meine Umsetzung mit einem nicht-öffentlichen Konstruktor. Das einzige Problem jetzt ist es gibt keine Möglichkeit, eine benutzerdefinierte Einschränkung auf C# - Generika, also ich werfe eine Laufzeitausnahme für abgeleitete Klassen mit öffentlichen default-Konstruktoren statt einer compile-Zeit-Fehler.
InformationsquelleAutor Chris Shepley
Können Sie eine singleton-Klasse basieren und mit ein bisschen schummeln (Reflexion).
Sie können (run-time) durchzusetzen, die eine Klasse verfügt über keinen öffentlichen Konstruktor.
InformationsquelleAutor Wesley
Für einen generischen code, der wiederverwendet werden kann, sollten Sie überlegen, thread-Sicherheit an der Stelle, wo Sie erstellen, die die singleton-Instanz.
Als es ist,
(instance == null)
könnte zu true ausgewertet werden in separaten threads.Eintreten für schlechtes Verhalten, weil es vorhanden ist, schlechtes Verhalten ist sehr sehr schlecht.
Ich glaube nicht, dass es befürworten schlechtes Verhalten überhaupt. Die meisten Anwendungen müssen nicht thread-sicher, so ist es nicht immer Wert, die Zyklen, um sicherzustellen, dass es ohne diese Anforderung. Es ist subjektiv. Zu sagen, dass eine Lösung schlecht ist, weil es nicht Konto für eine Nutzung, die die meisten Menschen nicht haben, ist nicht unbedingt gültig.
lohnt sich die Zyklen" klingt wie eine vorzeitige Optimierung zu mir. Wenn die thread-Sicherheit ist so einfach hinzufügen, wie es in diesem Fall, ein kleines Stück von generischem code, warum nicht?
Ich war das kommentieren mehr auf die Philosophie, die bestehende schlechte Verhalten anderen erlaubt, Sie zu wiederholen Verhalten als die Beratung für diese spezielle Frage.
InformationsquelleAutor xyz
Beachten Sie, dass
InformationsquelleAutor Ehsan Shirvan
Diese wie ich es gemacht habe, mit dem Aktuellen Muster (auch thread-sichere Initialisierung)
Verwendung:
Verbrauchen die singleton:
InformationsquelleAutor MaurGi
Ist es möglich, ohne Reflexion.
Brauchen wir nur eine generische Klasse zum singleton-Muster, das nimmt zwei parameter - die Umsetzung der konkreten singleton-Klasse und die Schnittstelle für die konkrete singleton.
Die generischen singleton-Klasse implementiert das singleton pattern und alle Sachen, die Sie brauchen - zum Beispiel die Protokollierung, sperren oder sonst was.
InformationsquelleAutor Monotomy