![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
реализация шаблона Singleton
Tyke © (2002-11-21 15:23:00)Коллеги, реализовывал ли кто шаблон Singleton?
Попытался реализовать, смутило отсутствие в Delphi переменных класса и ещё кое-что. Кто реализовывал, расскажите про своё решение.
Юрий Зотов (2002-11-23 10:46:00) [1]Все просто.
interface
type
TMy = class(...)
public
class function NewInstance: TObject; overrride;
procedure FreeInstance; override
end;
implementation
var
My: TMy = nil;
class function TMy.NewInstance: TObject;
begin
if My = nil then
begin
Result := inherited NewInstance;
My := Result
end
else Result := My
end;
procedure TMy.FreeInstance;
begin
inherited;
My := nil
end;
VaS (2002-11-23 10:31:00) [2]А так? :)
interface
type
IMy = interface
["{55056794-DD76-4EB4-B675-5CA1C214DABE}"]
procedure Func;
end;
function GetMy: IMy;
implementation
type
TMy = class(TInterfacedObject, IMy)
public
procedure Func;
end;
var
My: IMy = nil;
function GetMy: IMy;
begin
if My = nil then
My:=TMy.Create;
Result:=My;
end;
procedure TMy.Func;
begin
//
end;
initialization
finalization
My:=nil;
end.
Tyke (2002-11-22 23:10:00) [3]> Так помести определение TMy в implementation и проблемы
> нет.
А как ты тогда получишь объект если тип TMy виден только внутри модуля. Попробуй обратись к переменной, которая в implementation :-)
VaS (2002-11-22 14:18:00) [4]> И так же радостно мы где угодно можем вызвать TMy.Create;
> И получим кучу новых экземляров.
Так помести определение TMy в implementation и проблемы нет.
Tyke (2002-11-22 13:04:00) [5]Спасибо всем кто ответил и не ответил тоже :-)
2 VaS ©
И так же радостно мы где угодно можем вызвать TMy.Create;
И получим кучу новых экземляров.
2 down
Спасибо за линк на статью, дала ответы на кое-какие вопросы.
И добавила новые вопросы :-).
Очень удивился когда узнал о таком поведении локальной типизированной константы. Но как поле класса она стопроцентно не может заменить, область видимости у ней только метод или процедура. Поэтому, что применять: локальную типизированную константу или скрытую в implementation переменную мне кажется дело вкуса.
Кстати пример описанный в данной статье, не полностью удовлетворяет требованиям шаблона Singleton. Сделайте:
P1 := TProgressor.Instance;
P2 := TProgressor.Instance;
P1.ReleaseInstance;
P3 := TProgressor.Instance;
Ооопс! Получили ещё один экземпляр.
Шаблон я реализовал, с применением переменной в implementation. Но всё равно не красиво как-то.
down (2002-11-21 17:14:00) [6]http://www.delphikingdom.com/article/singleton.htm
VaS (2002-11-21 17:01:00) [7]
interface
type
TMy = class
public
procedure Func;
end;
function GetMy: TMy;
implementation
var
My: TMy = nil;
function GetMy: TMy;
begin
if My = nil then
My:=TMy.Create;
Result:=My;
end;
...
finalization
FreeAndNil(My);
end.
И радостно вызываем где угодно GetMy.Func().
evgeg (2002-11-21 15:37:00) [8]В Дельфи шаблон "одиночка" не нужен. Он нужен в языках, не поддерживающих модули, таких как C++.
В интерфейсе модуля определяете нужные функции. Данные храните в переменных их секции implementation. Вот вам и одиночка -- модуль.
> Шаблонов у нас нет
Шаблон тут употребляется в другом смысле, не так, как структура языка С++ template, а как типовое решение.
MBo (2002-11-21 15:32:00) [9]Calm
Шаблонов у нас нет, а singleton - объект, могущий существовать лишь в единственном экземпляре
MBo (2002-11-21 15:31:00) [10]>Tyke
Есть классовые процедуры и функции (Class function ), так что, введя в модуле класса внутреннюю переменную, нетрудно реализовать Singleton
Calm (2002-11-21 15:30:00) [11]Я, конечно, извиняюсь, но что это такое - "шаблон Singleton"?