Показать сообщение отдельно
Старый 09.02.2005, 12:13     # 3
is_absent
::VIP::
 
Аватар для is_absent
 
Регистрация: 27.01.2004
Адрес: Россия. Барнаул
Пол: Male
Сообщения: 417

is_absent Молодецis_absent Молодецis_absent Молодец
Код:
{$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....
__________________
Nunc est bibendum
is_absent вне форума