Ich verwende dafür gerne eine kleine generische Hilfsklasse, mit der ich (nahezu) jede Klasse bei Bedarf zu einem Singleton machen kann, ohne die Verwendung auf diesen Fall zu beschränken:
Delphi-Quellcode:
unit Common.Singleton;
interface
type
TSingleton<T:
class,
constructor> =
class
strict private
class var
FInstance: T;
class destructor DestroyClass;
private
class function GetInstance: T;
static;
public
class property Instance: T
read GetInstance;
end;
implementation
class destructor TSingleton<T>.DestroyClass;
begin
FInstance.Free;
end;
class function TSingleton<T>.GetInstance: T;
begin
if FInstance =
nil then
FInstance := T.Create;
result := FInstance;
end;
end.
Der Zugriff erfolgt dann über entsprechende Methoden wie z.B. diese:
Delphi-Quellcode:
function TranslationManager: TTranslationManager;
begin
result := TSingleton<TTranslationManager>.Instance;
end;
oder je nach Geschmack auch als Klassenmethode:
Delphi-Quellcode:
class function TTranslationManager.Singleton: TTranslationManager;
begin
Result := TSingleton<TTranslationManager>.Instance;
end;
Letzteres verdeutlicht die Singleton-Eigenschaft schon im Namen, aber das ist vielleicht nicht immer erwünscht.