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 через класс.

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

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

Вам также может понравиться...

7 комментариев

  1. 27.03.2026

    tadalafil 20mg

    tadalafil 20mg

  2. 03.04.2026

    doryx 70 mg

    doryx 70 mg

  3. 05.04.2026

    sertraline hydrochloride 50 mg

    sertraline hydrochloride 50 mg

  4. 06.04.2026

    metoprolol tartrate 25 mg tablet

    metoprolol tartrate 25 mg tablet

  5. 26.04.2026

    vidalista 60 mg tablets

    vidalista 60 mg tablets

  6. 15.05.2026

    semaglutide injectie schema

    semaglutide injectie schema

  7. 16.05.2026

    semaglutid receptfritt tabletter apoteket

    semaglutid receptfritt tabletter apoteket

Добавить комментарий

Войти с помощью: