Форум: "Основная";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];
Внизреализация шаблона 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c