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

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

Singleton [D5, Win2k]


Страницы:   1 2 3

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]

Принято к сведению.
Всем спасибо.


Страницы:   1 2 3

Наверх

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