Bei meinem älteren Delphi (
BDS 2006) hindert mich niemand daran, beliebig viele Instanzen der TDeineKlasse mit dem 'Create'-Konstruktor zu erstellen (obwohl der Konstruktor ja als privat deklariert ist).
Ich würde für ein Singleton eher so vorgehen:
Delphi-Quellcode:
type
TSingleton =
Class
private
class var fInstance: TSingleton;
class var fRefCnt : Integer;
class function NewInstance: TObject;
Override;
procedure FreeInstance;
override;
End;
implementation
{ TSingleton }
procedure TSingleton.FreeInstance;
begin
if fRefCnt=1
then begin
inherited FreeInstance;
fInstance:=Nil;
end;
dec (fRefCnt);
end;
class function TSingleton.NewInstance: TObject;
begin
if fInstance=Nil
then
fInstance := TSingleton(
inherited NewInstance);
Result := fInstance;
inc(fRefCnt);
end;
end.
Dann muss ich gar nicht wissen, das das ein Singleton ist, sondern kann mir immer, wenn ich es brauche, eine Instanz erstellen. Die Objektlogik mappt das ja auf die eine Instanz. Zudem habe ich so keine Möglichkeit, mehrere Instanzen zu erstellen.
Ich persönlich halte das für sauberer, als umständlich über 'GetInstance' auf die globalen Daten zuzugreifen.