Hallo,
folgendes ist mir aufgefallen:
Zitat:
Delphi-Quellcode:
var BK:TBundeskanzer;
begin
// BK muss natürlich zuvor noch initialisiert werden
TBundeskanzer.getInstance; // Funktion steht zur Verfügung
BK.getInstance; // Funktion wird nicht gefunden
end;
Das ist so nicht korrekt, class functions (& procedures) können in Delphi sehr wohl auch auf einer Instanz aufgerufen werden.
Zitat:
Delphi-Quellcode:
Destructor TBundeskanzler.destroy;
begin
if g_BK = self then
g_BK := nil;
inherited destroy;
end;
Die Prüfung auf "g_BK = Self" kannst Du Dir sparen (es ist ja ein Singleton).
Statt dessen finde ich es sinnvoller im Destruktor eine
Exception ausgelöst werden, damit niemand (aus Versehen oder absichtlich) die Singleton-Instanz zerstört.
Delphi-Quellcode:
destructor TBundeskanzler.destroy;
begin
raise Exception.Create('
Singleton darf nicht zerstört werden!');
end;
Die Methode getInstance sollte nach Möglichkeit Threadsicher gestaltet werden, damit beim gleichzeitigen Zugriff durch zwei Threads beide die selbe Instanz erhalten:
Delphi-Quellcode:
Function TBundeskanzer.getInstance:TBundeskanzler;
begin
if (g_BK = nil) // statt TBundeskanzler.create reicht auch nur Create
then InterlockedCompareExchange(g_BK, Create, nil);
Result := g_BK;
end;
mr2