Zitat von
Der_Unwissende:
Allerdings kommt man beim Singleton Pattern (soviel ich weiß) nicht mehr um eine globale Variable herum.
Wird zwar eine sehr theoretische Diskussion; aber ich habe nichts gegen globale Variablen. Die Verwaltung und Sichtbarkeit sollte allerdings klar geregelt sein.
Nehmen wir zum Beispiel die GetInstance() einer möglichen Singleton-Implementation:
Delphi-Quellcode:
class function TFoo.GetInstance(): TFoo;
{$WRITEABLECONST ON}
const
InstanceLock: Integer = Ord(False);
Instance: TFoo = nil;
{$WRITEABLECONST OFF}
begin
Result := Instance;
if not Assigned(Result) then
begin
// Wait until lock is available
while InterlockedExchange(InstanceLock, Ord(True)) = Ord(True) do
Sleep(0);
try
// Create Instance if needed
if not Assigned(Instance) then
Instance := TFoo.Create();
Result := Instance;
finally
// Release the lock
InterlockedExchange(InstanceLock, Ord(False));
end;
end;
end;
Durch die Ausnutzung von {$WRITEABLECONST} sind die globalen Variablen nur innerhalb der Funktion sichtbar (und können nicht 'versehentlich' von 'außen' modifiziert werden).