Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.02;
Скачать: CL | DM;

Вниз

реализация шаблона Singleton   Найти похожие ветки 

 
Tyke   (2002-11-21 15:23) [0]

Коллеги, реализовывал ли кто шаблон Singleton?
Попытался реализовать, смутило отсутствие в Delphi переменных класса и ещё кое-что. Кто реализовывал, расскажите про своё решение.


 
Calm ©   (2002-11-21 15:30) [1]

Я, конечно, извиняюсь, но что это такое - "шаблон Singleton"?


 
MBo ©   (2002-11-21 15:31) [2]

>Tyke
Есть классовые процедуры и функции (Class function ), так что, введя в модуле класса внутреннюю переменную, нетрудно реализовать Singleton


 
MBo ©   (2002-11-21 15:32) [3]

Calm
Шаблонов у нас нет, а singleton - объект, могущий существовать лишь в единственном экземпляре


 
evgeg ©   (2002-11-21 15:37) [4]

В Дельфи шаблон "одиночка" не нужен. Он нужен в языках, не поддерживающих модули, таких как C++.

В интерфейсе модуля определяете нужные функции. Данные храните в переменных их секции implementation. Вот вам и одиночка -- модуль.

> Шаблонов у нас нет

Шаблон тут употребляется в другом смысле, не так, как структура языка С++ template, а как типовое решение.


 
VaS ©   (2002-11-21 17:01) [5]


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().


 
down   (2002-11-21 17:14) [6]

http://www.delphikingdom.com/article/singleton.htm


 
Tyke   (2002-11-22 13:04) [7]

Спасибо всем кто ответил и не ответил тоже :-)

2 VaS ©
И так же радостно мы где угодно можем вызвать TMy.Create;
И получим кучу новых экземляров.

2 down
Спасибо за линк на статью, дала ответы на кое-какие вопросы.
И добавила новые вопросы :-).
Очень удивился когда узнал о таком поведении локальной типизированной константы. Но как поле класса она стопроцентно не может заменить, область видимости у ней только метод или процедура. Поэтому, что применять: локальную типизированную константу или скрытую в implementation переменную мне кажется дело вкуса.

Кстати пример описанный в данной статье, не полностью удовлетворяет требованиям шаблона Singleton. Сделайте:
P1 := TProgressor.Instance;
P2 := TProgressor.Instance;
P1.ReleaseInstance;
P3 := TProgressor.Instance;

Ооопс! Получили ещё один экземпляр.

Шаблон я реализовал, с применением переменной в implementation. Но всё равно не красиво как-то.


 
VaS ©   (2002-11-22 14:18) [8]

> И так же радостно мы где угодно можем вызвать TMy.Create;
> И получим кучу новых экземляров.

Так помести определение TMy в implementation и проблемы нет.



 
Tyke   (2002-11-22 23:10) [9]

> Так помести определение TMy в implementation и проблемы
> нет.

А как ты тогда получишь объект если тип TMy виден только внутри модуля. Попробуй обратись к переменной, которая в implementation :-)


 
VaS ©   (2002-11-23 10:31) [10]

А так? :)


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.


 
Юрий Зотов ©   (2002-11-23 10:46) [11]

Все просто.

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;



Страницы: 1 вся ветка

Текущий архив: 2002.12.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
1-4348
VJar
2002-11-22 09:42
2002.12.02
Отслеживание Shortcut


1-4384
Niko
2002-11-20 18:18
2002.12.02
SynEdit


14-4621
alex134
2002-11-12 20:18
2002.12.02
Мышь оптическая A4


1-4337
Cranium
2002-11-22 00:01
2002.12.02
Дочерняя форма при развертывании ....


1-4504
Greogry
2002-11-20 11:06
2002.12.02
Excel!