Singleton & Delphi

Очень простой шаблон проектирования, который подразумевает, что объект определённого класса в программе будет в единственном экземпляре.

Его преимущество в том, что объект такого класса не нужно инициализировать и использовать переменную (явно) для доступа к нему. Хотя, желательно уничтожить перед завершением программы (но не так страшно, если даже и не уничтожим).

Давайте рассмотрим простой пример такого класса:

type
  TSingletonClass = class
  private
    class var
      Instance: TSingletonClass;
  public
    class function GetInstance: TSingletonClass;
    class procedure DestroyInstance;
    procedure DoSomething;
  end;

...

{ TSingletonClass }

procedure TSingletonClass.DoSomething;
begin
  ShowMessage('Hi');
end;

class procedure TSingletonClass.DestroyInstance;
begin
  if Assigned(Instance) then
    Instance.Free;
end;

class function TSingletonClass.GetInstance: TSingletonClass;
begin
  if not Assigned(Instance) then
    Instance := TSingletonClass.Create;
  Result := Instance;
end;

Постоянных и основных всего два метода: GetInstance и DestroyInstance. Первый метод предоставляет доступ к методам класса, а второй позволяет безопасно уничтожить синглтон. Теоретически, последний метод не обязателен, т.к. объект класса всегда будет один и утечек памяти на стадии работы программы быть не может. Утечка произойдёт только после закрытия программы, когда самой программе это уже не важно. Но не забываем про правила хорошего тона.

Я показал как выглядит синглтон, но так и не показал, как его используют и в чем его преимущество. Хотя, многие уже наверно догадались.

procedure TForm1.Button1Click(Sender: TObject);
begin
  TSingletonClass.GetInstance.DoSomething;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  //Уничтожение, если был использован синглтон
  TSingletonClass.DestroyInstance; 
end;

Это весь код. До этого не был инициализирован объект и мы видим, что обращаемся к не классовому методу DoSomething через класс.

Преимущество синглтона в том, что объект может быть и вовсе не создан, если к нему не произошло обращений. Следовательно и память была не выделена. Таким способом, мы можем обращаться к объекту в любой момент времени из любого места программы, не заботясь о том, был ли создан объект или нет. В целом, это всё.

Всем хорошего кода)


You may also like...