![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Singleton [D5, Win2k]
Fktrc © (2004-11-23 05:10:00)Можно ли в Delphi создать единственный экземпляр класса на все приложение? Т.е. чтобы при попытках создать второй выдавалась либо ошибка компиляции, либо рантайм ошибка. По-моему, такие объекты называют singleton, хотя могу и ошибаться.
Пока приходит в голову только создание какого-л именованного объекта ядра в конструкторе объекта. Но нет ли другого способа, изящнее?
Суслик (2004-11-23 12:47:00) [21]
> [25] Palladin © (23.11.04 12:41)
> запихав конструктор в private
а ты попробуй :)))
Create, идущий от TObject не запихаешь никуда - все равно, собака, виден :))
Отдестроить объект любому клиенту в дельфи помешать нельзя :)))
Хоть обзасовывайся деструктор куда угодно.
С сях можно, в java можно - в дельфи нет.
> но нет классовых полей.
А знаешь почему? Потому, как в отличие от си++ и java статические (классовые методы) в дельфи могут быть виртуальны. Отседова ограничение на статические переменные.
Palladin (2004-11-23 12:42:00) [22]
> что такое "буквальной"?
Это вопрос к KSergey, а не ко мне...
Palladin (2004-11-23 12:41:00) [23]
> [22] Суслик © (23.11.04 12:36)
Да это и ежу понятно. Вот только, в делфи есть классовые методы, но нет классовых полей.
Что то на подобие Singletone можно получить, запихав конструктор в private или protected (вместе с деструктором) написать толпу классовых методов и описать в implementation "поля" класса... в таком случае идейная замена выйдет неплохая.
Суслик (2004-11-23 12:40:00) [24]
> [23] Palladin © (23.11.04 12:37)
что такое "буквальной"?
С языках, на основе которой пишет Гамма свою знаменитую книга, если не ошибаюсь, нет виртуальных статических методов!
Т.е. методов
class function F: Integer; virtual;
Поэтому в тех языках нужно делать именно так, как написано в книге.
В дельфи есть штатных механизм фабрик и singleton. Да, он не очень похож на примеры из книги. НО делает ровно тоже самое.
Palladin (2004-11-23 12:37:00) [25]Если речь идет об идейной замене, а не буквальной. :)
Суслик (2004-11-23 12:36:00) [26]
> Это Singletone.
пиши через классовые методы (class procedure и пр.), обращаясь к ним через класс:
TRecource.Write(...)
..
TRecource.Read(...)
тоже singleton..
Palladin (2004-11-23 12:35:00) [27]
> [15] KSergey © (23.11.04 12:16)
В таком случае заголовочные файлы c тоже Singletone.
Palladin (2004-11-23 12:32:00) [28]Фабрика фабрикой. Это конкретная реализация. Это конкретный пример. Можно обойтись и без singletone.
А я разработал свой шаблон в котором Singletone нужен и без него не обойтись. Или у меня в программе создан механизм при котором без Singletone тоже не обойтись... Простейший пример: класс для работы с ресурсом, доступ к котрому должен производится только из одного экземпляра класса, другие экземпляры недопустимы. Это Singletone.
Reindeer Moss Eater (2004-11-23 12:21:00) [29]Вопрос бы в единственном экземпляре на процесс.
Суслик (2004-11-23 12:20:00) [30]
> [16] Reindeer Moss Eater © (23.11.04 12:17)
не вижу проблемы в том, что приводится другое видение данного вопроса...
Суслик (2004-11-23 12:19:00) [31]
> [15] KSergey © (23.11.04 12:16)
Насколько я понимаю, что все-таки модуль нельзя использовать как singleton именно потому, что мудули не могут использоваться в рамках полиморфизма.
Мое же видение singleton через классовые сслыки вполне укладываться в рамки полиформизма.
Reindeer Moss Eater (2004-11-23 12:17:00) [32]Автору вопроса нужен был единственный экземпляр класса.
И автор робко предположил, что то что он хочет называется singleton.
Как этого достичь, ему сказали.
При чем здесь то, что это не singlrton?
KSergey (2004-11-23 12:16:00) [33]> [11] Palladin © (23.11.04 11:52)
Да, модуль - это безусловно не класс-синглетон. Речь шла об идейной замене, а не буквальной.
Т.е. модуль есть един, и он - есть без нашего участия. Так есть ли смысл изобретать что-то?
> Что бы модуль превратить в Singletone в Interface нужно
> объявить только функции работы.
Да, конечно.
> Но это уже не Singletone в понятии OOD&P.
Буквально - нет. По сути - от чего же?
Суслик (2004-11-23 12:14:00) [34]
> [13] Palladin © (23.11.04 12:05)
Вопрос проектирования говоришь...
Ну-ну.
Вот только изначальный вопрос тут не на концептуальном уровне, а на уровне реализации. Причем, реализации на конкретном языке. Вот и вопрос, зачем нужно в дельфи иметь singleton.
Songleton в теории обычно идут в связке с другими типовыми решениями. Например, abstract factory. Вопрос, зачем нужно в рамках дельфиделать singleton да и фабрику ту же, когда есть виртуальные классовыеметоды.
Заметь, я не говорю про проектирование. Я говорю, про реализацию, зачем в конкретном языке городить огород, когда можно, например, в случае фабрики и singleton сделать так:
type
TMyFactory = class
public class function CreateFirstObject: TObject; virtual; abstract;
public class function CreateSecondObject: TObject; virtual; abstract;
end;
TFirstFactory = class (TMyFactory)
public class function CreateFirstObject: TObject; override;
public class function CreateSecondObject: TObject; override;
end;
implementation
class function TFirstFactory.CreateFirstObject: TObject; override;
begin
Result := TFistObject.Create;
end;
class function TFirstFactory.CreateSecondObject: TObject; override;
begin
Result := TSecondObject.Create;
end;
end.
В качестве фабрики можешь описывать TMyFactory, а передавать TFirstFactory. Чем не фабрика? Концептуально именно она. ЧЕм не singleton? Концептуально именно он. Спустившись на уровень реализации задай себе вопрос, зачем тебе нужна именно такая реалзиация singleton через NewInstance и FreeInstance?
Palladin (2004-11-23 12:05:00) [35]при чем тут делфи, это вопрос проектирования... воспользуйся поисковиком и найди описание singletone... там будет объяснение...
Суслик (2004-11-23 12:02:00) [36]Может ли мне кто-нибудь объяснить смысл делать в дельфиsingleton?
Palladin (2004-11-23 11:52:00) [37]Он не прав. Singletone это во-первых, контроль самого программиста. Модуль не есть Singletone. Класс объявлен, в interface, можно создать сколько угодно объектов этого класса. Другое дело когда при вызове конструктора возвращается один и тот же объект. Это и есть Singletone.
Clipboard, это не Singletone. Так же как и Application. Что бы модуль превратить в Singletone в Interface нужно объявить только функции работы. Но это уже не Singletone в понятии OOD&P.
Суслик (2004-11-23 11:49:00) [38]Мне всегда хватало
tsingleton = class
class function SomeFunction: Integer;
class procedure SomeProcedure();
...
end;
Значения можно хранить под implementation.
Использовать TsingleTon.SomeProcedure.
Отличие от singleton в том, что мой tsingleton всегда есть ровно онид по определению и его убить нельзя.
KSergey (2004-11-23 11:07:00) [39]Вообще, как как-то сказал Reindeer Moss Eater ©, "модуль в паскале - и есть уже синглетон! Зачем изобретать что-то еще??"
И я с ним согласен ;)
Fktrc (2004-11-23 10:47:00) [40]Принято к сведению.
Всем спасибо.