Очень простой шаблон проектирования, который подразумевает, что объект определённого класса в программе будет в единственном экземпляре.
Его преимущество в том, что объект такого класса не нужно инициализировать и использовать переменную (явно) для доступа к нему. Хотя, желательно уничтожить перед завершением программы (но не так страшно, если даже и не уничтожим).
Давайте рассмотрим простой пример такого класса:
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 через класс.
Преимущество синглтона в том, что объект может быть и вовсе не создан, если к нему не произошло обращений. Следовательно и память была не выделена. Таким способом, мы можем обращаться к объекту в любой момент времени из любого места программы, не заботясь о том, был ли создан объект или нет. В целом, это всё.
Всем хорошего кода)