Код:
{$J+}
unit Singleton;
interface
uses
Classes, SysUtils, Forms, Controls, Windows;
type
TSingleton = class(TControl)
private
//
protected
//
constructor CreateInstance;
class function AccessInstance(Request: Integer): TSingleton;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
class function Instance: TSingleton;
class procedure ReleaseInstance;
end;
implementation
class function TSingleton.AccessInstance(Request: Integer): TSingleton;
const
FInstance: TSingleton = nil;
begin
case Request of
0: ;
1: if not Assigned(FInstance) then FInstance:= CreateInstance;
2: FInstance := nil;
else raise Exception.CreateFmt('Illegal request %d in AccessInstance', [Request]);
end;
Result := FInstance;
end;
constructor TSingleton.Create;
begin
// нельзя его вызывать!
raise Exception.CreateFmt('Access class %s through Instance only', [ClassName]);
end;
constructor TSingleton.CreateInstance;
begin
inherited Create(nil);
// делаем то, что нужно
end;
destructor TSingleton.Destroy;
begin
// прибираемся за собой
inherited;
end;
class function TSingleton.Instance: TSingleton;
begin
Result := AccessInstance(1);
end;
class procedure TSingleton.ReleaseInstance;
begin
AccessInstance(0).Free;
end;
end.
так красивше
соответственно потом обращаться TSingleton.instance....