Erstellen einer Singleton-Klasse mit dispatch_once für die Klassenhierarchie

8

Ich habe zwei untergeordnete Klassen, die von 'MyClass' erben, und jede untergeordnete Klasse sollte ein Singleton sein.

Ich habe dieses Muster verwendet, um eine statische Instanz zu erhalten, wenn keine anderen Klassen erben:

%Vor%

Das funktioniert einfach großartig. Wenn ich jetzt zwei neue untergeordnete Klassen, FirstClass und SecondClass, die beide von MyClass erben, hinzufügen, wie stelle ich sicher, dass ich die entsprechende ChildClass zurückbekomme?

%Vor%

Das oben genannte bedeutet, dass ich immer die Klasse zurückerhalte, die ich als erste Klasse instanziiert habe:

%Vor%

Was ist der beste Weg, um die entsprechenden untergeordneten Klassen-Singletons zu erstellen, ohne die getInstance -Methode zu jeder der untergeordneten Klassen hinzuzufügen?

    
Howard Spear 27.09.2012, 23:05
quelle

3 Antworten

6

Wenn Sie keinen guten Grund haben, sollten Sie im Allgemeinen vermeiden, Singles zu unterklassifizieren. Es schafft eine sehr verwirrende Situation. Wenn Sie ein Singleton MyClass erstellen, können Sie dann ein Singleton FirstClass erstellen? Da FirstClass immer überall verwendbar sein muss, wenn MyClass (durch Liskov) verwendbar ist, gibt es jetzt drei "singleton" MyClass -Objekte. Jetzt ist ObjC sehr locker mit Singletons, und das ist eine gute Sache, aber das ist immer noch sehr seltsam.

OK, das sagte, was ist mit Ihrem Problem? Zuerst die Lösung, dann die Antwort. Die Lösung ist, dass MyClass wahrscheinlich kein Singleton sein sollte, wie oben diskutiert. Befreie getInstance in der Oberklasse und definiere sie einfach in den Unterklassen.

Die Antwort auf das, was passiert, ist in deinem dispatch_once . Sie übergeben in allen Fällen das gleiche statische once -Token. dispatch_once wird nicht mehr als einmal je für ein bestimmtes Token ausgeführt. Die einzige Möglichkeit besteht darin, verschiedene Tokens für jede Klasse zu übergeben, und ich kenne keinen geeigneten Weg, dies zu tun, ohne den Code dispatch_once in jeder Datei zu duplizieren. Sie könnten versuchen, verschiedene once -Token für jede Unterklasse zu erstellen, aber das ist wahrscheinlich mehr Ärger und Code als nur das Duplizieren der sharedInstance -Methode.

Übrigens, nennen Sie es nicht getInstance . "Get" hat eine besondere Bedeutung in ObjC, und du meinst das nicht hier, also ist es verwirrend. Dies wird normalerweise sharedInstance oder besser sharedSomething genannt, wobei "etwas" deine Klasse ist. Wenn Sie wirklich meinen, dass es ein MyClass geben sollte und ein FirstClass und ein SecondClass , dann können Sie sharedInstance in allen dreien implementieren.

    
Rob Napier 28.09.2012, 02:08
quelle
1

Sie wissen, Singletons sind knorrig, oder? viele Singletons sind ein größeres Problem. Ende der Vorsicht.

Sie können einfach dispatch_once verwenden, um das Basis-Singleton zu erstellen. Dann könnte Ihre Basis eine Map (z. B. Dictionary {key: ClassName | value: Instance}) ihrer abgeleiteten Typen enthalten.

, dass Sie dispatch_once verwenden, deutet darauf hin, dass dies in einem Multithread-Kontext verwendet wird. In diesem Fall müssten Sie die Interaktionen mit dem Wörterbuch mithilfe eines Mutex schützen.

Dann würden Ihre Nachrichten von Unterklassen basierend auf der Nachrichtenklasse ( self ) bestimmen, welche Klasse gesucht werden soll (falls erforderlich, diese Instanz erstellen).

    
justin 27.09.2012 23:46
quelle
0

verwende id in deinem myClass in firstClass wie das

%Vor%

Ich denke, das sollte funktionieren

    
Dennis Farandy 08.06.2015 08:01
quelle