Singletons sind Objekte die nur genau einmal erzeugt werden und nicht von aussen instanziert werden knnen.
Ein Logger könnte zum Beispiel so ein Singleton werden, da man z.B. aus allen Thread s immer auf denselben Logger gehen möchte und nicht pro Thread einen eigenen Logger benötigt.
Auch Borland verwendet in der VCL Singeltons. Beispiele hierfür sind die Objekte Application, Printer oder auch Clipboard. Hier soll allerdings ein etwas anderer Weg für Singelton's aufgezeigt werden, als wie die Borland macht. Der Vorteil dieser Variante ist, dass es hier unmöglich ist, mehr als eine Instanz der Singelton-Klasse zu erzeugen, was beim Borland-Weg nicht der Fall ist.
Im Folgenden erstmal der Code dieser Variante:
TSingleton = class
private
constructor Create;
public
class function INSTANCE: TSingleton;
end;
implementation
var
TheInstance: TSingleton = NIL;
constructor TSingleton.Create;
begin
inherited Create;
end;
class function TSingleton.INSTANCE: TSingleton;
begin
if TheInstance = NIL then
TheInstance := TSingleton.Create;
Result := TheInstance;
end;
Wie Ihr seht, kann das Teil von aussen gar nicht erzeugt werden, sondern man muss mit INSTANCE.DoSomething ohne sich dabei um die Instanzierung zu kümmern.
Anmerkungen:
Vielleicht schnell die wesentlichen Punkte hervorgehoben:
- Der Constructor wird "versteckt", indem er in den Privat-Teil verschoben wird
- Globale Instanz in Unit-Interner globaler Objektvariabel
- Mittels einer Klassenfunktion (Classfunction) namens INSTANCE wird auf die Instanz zugegriffen. Innerhalb der Klassenfunktion kann der Konstruktor natürlich aufgerufen werden, da die Klassfunktion auf den Privat-Teil Zugriff hat.
Auf diese Weise ist es nicht möglich mehr als ein Objekt dieser Klasse zu instanzieren.