Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

И опять идеологический вопрос


qube ©   (2002-09-19 10:59:00) 

Нужно создать класс, допустим, TFooEngine. В системе будет присутствовать только один глобальный экземпляр этого класса. Как лучше: наследовать TFooEngine от TComponent и создавать его с Application в качестве владельца, или просто

Engine := TFooEngine.Create(..);
Application.Run;
Engine.Free;


Старый Паскалист   (2002-09-19 11:55:00) [1]

function Engine: TFooEngine;
begin
if theEngine = nil then
theEngine := TFooEngine.Create(какие-то параметры по умолчанию);
// Параметры по умолчанию могут, например, грузиться из ini-файла

Result := theEngine;
end;



procedure CreateEngineWithParams(......);
// даёт возможность приложению определить, с какими параметрами
// нужно создавать Engine.
// эта процедура специально не объявлена, как ф-я,
// поскольку она мжет быть вызвана только один раз
// при запуске.
// Эта процедура вовсе не обязана действительно создавать
// объект, она может просто сохранить где-то
// параметры, которые будут извлечены при создании по требованию
begin
if theEngine = nil then
theEngine := TFooEngine.Create(......)
else
raise ...;
end;

Но вообще говоря, с моей точки зрения, возможность конструирования
разными способами не должна быть характерен для синглтонов.

Ведь в любом случае в каждом приложении ты сможешь вызвать
конструктор только с одним конкретным набором параметров.


qube   (2002-09-19 11:52:00) [2]

ок, вопрос закрыт.
всем спасибо.

сотворил, как обычно, много шуму из ничего.


Separator   (2002-09-19 11:50:00) [3]

Почему не подходит? Просто создавай когда надо и все будет ок.

type
TFooEngine = class;
public
constructor Create(Parametrs); override;
end;

implementation

var
theEngine: TFooEngine;

constructor TFooEngine.Create(Parametrs);
begin
inherited Create;
// Делай что-нибудь
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if theEngine=nil then
theEngine:= TFooEngine.Create(Parametrs)
end;

finalization
if theEngine<>nil then
theEngine.Free
end.


qube   (2002-09-19 11:35:00) [4]

Да, тут мысль пришла.
А если конструктор у этого TFooEngine с параметрами, то создание по требованию уже не подходит. Я понимаю, что есть туча способов, а хочется красивенько.


Separator   (2002-09-19 11:32:00) [5]

"Комитет национальной безопасности"
(Я тож так думаю)


qube   (2002-09-19 11:26:00) [6]

КНБ -- это что?
(Ох, чувствую, удалят эту ветку в "Потрепаться")


Separator   (2002-09-19 11:24:00) [7]

Понимаю, мне тоже не грозить, зато может КНБ наехать ;)


qube   (2002-09-19 11:19:00) [8]


> Separator ©

:) Мне ФСБ не грозит. Разве что СБУ.


Separator   (2002-09-19 11:18:00) [9]

При аварийном завершении (например если свет вырубили, типа ФСБ приехало) работы все равно ничего не поможет


qube   (2002-09-19 11:14:00) [10]

Спасибо.


Старый Паскалист   (2002-09-19 11:12:00) [11]

сделай создание и разрушение в initialization/finalization.
А ещё лучше - сделай сознание по требованию,

function Engine: TFooEngine;
begin
if theEngine{глобальная переменная, определённая в impl.} = nil then
theEngine := TFooEngine.Create;
Result := theEngine;
end;

initialization
finalization
theEngine.Free; // вызовется всегда
end.

А связываться с TComponent и Application действительно
совершенно незачем.


qube   (2002-09-19 11:05:00) [12]


> Можешь ему вообще не передавать владельца, главное потом
> не забудь Free сделать

Тогда и от TComponent наследовать, собственно, незачем. Вопрос вот в чем: возможно ли, что при втором способе при аварийном завершении или еще какой беде Engine.Free не вызовется?


Separator   (2002-09-19 11:03:00) [13]

Можешь ему вообще не передавать владельца, главное потом не забудь Free сделать


Наверх

Титульная страница Поиск, карта сайта Написать письмо