@romber:
Nunja das Singleton-Muster ist ja dafür da, dass man nur eine Instanz einer Klasse bekommen kann / darf.
Das kann bei manchen modellierten Klassen von Nöten sein.
Du hast ja mit deinem Thread so ein Beispiel, wo wir Singleton anwenden können.
Gut schauen wir uns doch mal einen Standard Thread an:
Delphi-Quellcode:
MyThread = class(TThread)
private
public
procedure Execute;override;
constructor Create;
end; // of MyThread = class(TThread)
constructor TMyThread.Create;
begin
inherited Create(true); // Create Suspended
end; // of constructor TMyThread.Create;
////////////////////////////////////////////////////////////////////////////////
Nun könnten wir X-Objekte erzeugen, über
TMyThread.Create;
welches uns ja die Instanz eines Objektes zurück gibt.
Wir müssen aber nun sicherstellen, dass genau das nicht möglich ist.
Es soll nur ein Objekt erstellt werden, und wenn eines erstellt ist, dann soll nur die Referenz des Objektes (das schon
erzeugt worden ist) zurückgegeben werden.
Du hast hier denke ich 2 Möglichkeiten:
1. Du legtst eine globale Variable an (nicht sehr objektorientiert)
2. Du gibst deiner Klasse eine Klassenvariable mit, die im Kontext der Klasse existiert.
Ich würde dir zu 2. raten.
Gut probieren wir es mal aus
Delphi-Quellcode:
MyThread = class(TThread)
private
constructor Create;
??static?? FThreadObject:TThread; // zum speichern der Referenz auf deas "einzigartige" Objekt
public
procedure Execute;override;
procedure GetInstance:TMyThread;
end; // of MyThread = class(TThread)
procedure TMyThreadGetInstance:TMyThread;
begin
if FThreadObject <> NIL then
begin
FFThread:=TMyThread.Create;
result:=FThreadObject;
end
else
begin
result:=FThreadObject;
end;
end; // of procedure TMyThreadGetInstance:TMyThread;
///////////////////////////////////////////////////////////////////////////////
constructor TMyThread.Create; // wird versteckt, da jetzt von aussen nicht mehr direkt aufrubar
begin
inherited Create(true); // Create Suspended
end; // of constructor TMyThread.Create;
////////////////////////////////////////////////////////////////////////////////
Nun kannst du (hoffe ich, da ich es jetzt von C# adaptiert habe, in Delphi könnte es evtl. Unterschiede geben)
so ein Objekt erzeugen
Delphi-Quellcode:
var
ThreadNo1:TMyThread;
ThreadNo2:TMyThread;
ThreadNo3:TMyThread;
...
ThreadNo1:=TMyThread.GetInstance; // Alles der gleiche Thread (bzw das gleiche Objekt der Threadklasse)
ThreadNo2:=TMyThread.GetInstance; // Alles der gleiche Thread (bzw das gleiche Objekt der Threadklasse)
ThreadNo3:=TMyThread.GetInstance; // Alles der gleiche Thread (bzw das gleiche Objekt der Threadklasse)
ThreadNoX:=TMyThread.Create; // Sollte nicht gehen!!!
Hoffe ich konnte dir ein wenig helfen,
falls noch fragen sind, schiess los...
Gruß
DelphiManiac