Verwendung von Singleton anstelle einer globalen statischen Instanz

8

Ich bin heute auf ein Problem gestoßen und ein Freund hat mir empfohlen, eine globale statische Instanz oder eleganter ein Singleton-Muster zu verwenden. Ich verbrachte ein paar Stunden damit, über Singletons zu lesen, aber einige Dinge entgehen mir immer noch.

Hintergrund: Was ich zu erreichen versuche, ist, eine Instanz einer API zu erstellen und diese Instanz in allen meinen Klassen zu verwenden (im Gegensatz zu einer neuen Verbindung usw.).

Es scheint ungefähr 100 Möglichkeiten zu geben, ein Singleton zu erstellen, aber mit etwas Hilfe von yoda Ich habe einige Thread-sichere Beispiele gefunden. ..so gegeben den folgenden Code:

%Vor%

Wie / Wo würden Sie diese neue Klasse instanziieren und wie sollte sie von einer separaten Klasse aufgerufen werden?

BEARBEITEN: Ich weiß, dass die Singleton-Klasse mit etwas wie

aufgerufen werden kann %Vor%

aber würde ich in der Lage sein, auf die Methoden innerhalb der APIs-Klasse (dh. obj1.Start) zuzugreifen? (Nicht, dass ich fragen muss).

BEARBEITEN # 2: Ich war vielleicht ein bisschen zu früh beim Überprüfen der Antwort, aber ich habe eine kleine Sache, die mich immer noch Probleme bereitet. Die API startet gerade gut, kann ich leider zwei Instanzen starten?

Neuer Code

%Vor%

aber wenn ich versuche, so etwas zu tun ...

%Vor%

Ich bekomme eine Fehlermeldung, dass ich nicht mehr als eine Instanz starten kann.

    
Ryan 06.04.2010, 22:56
quelle

3 Antworten

9

Warum fügen Sie Ihrem Singleton nicht einfach eine öffentliche APIClass-Eigenschaft hinzu?

%Vor%

Dann sieht Ihre aufrufende Seite folgendermaßen aus:

%Vor%

Oder, wenn Sie der Autor der API-Klasse sind, könnten Sie es selbst zu einem Singleton machen, anstatt es in ein Singleton einzufügen:

%Vor%

API-Aufruf:

%Vor%     
Igby Largeman 07.04.2010, 00:44
quelle
5

Hier ist der offizielle Microsoft-Ansatz .

Das Schöne am Singleton ist, dass Sie es überall im Code verwenden und darauf zugreifen können, ohne eine Instanz der Klasse erstellen zu müssen. In der Tat ist das ein raison d'etre, eine einzelne Instanz einer Klasse zB

Singleton.Instance.MyValue und Singleton.Instance.DoSomething ();

    
James Westgate 06.04.2010 23:03
quelle
3

Sie würden die Klasse nicht instanziieren - das Muster, das Sie verwenden, instanziiert sich selbst beim ersten Mal. Der Vorteil der von Ihnen verwendeten Methode ist, dass sie threadsicher ist (nur einmal instanziieren, egal wie viele Threads versuchen, darauf zuzugreifen), faul (sie wird nicht instanziiert, bis Sie versuchen, auf die Singleton-Klasse zuzugreifen) und einfach in der Umsetzung.

Sie müssen nur Folgendes tun:

%Vor%

Oder alternativ:

%Vor%     
Reed Copsey 06.04.2010 22:57
quelle

Tags und Links