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