USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« : 05-05-2005 03:41 » |
|
Народ поделитесь опытом
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #1 : 06-05-2005 21:55 » |
|
Singleton - один из самых простых и при этом весьма полезных паттернов проектирования. Применяется везде, где необходимо, чтобы экземпляр данного класса существовал в единственном числе.
Насчет применений даже затрудняюсь перечислить. Например, я зачастую создаю файл протокола программы как Singleton, поскольку писать в него могут многие модули, а протокол хотелось бы иметь единый для всех.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #2 : 11-05-2005 02:03 » |
|
>>Singleton - один из самых простых и при этом весьма полезных паттернов проектирования.
Во во - полезных, а в чем его полезность? Сколько ни думал не могу даже придумать где его можно использовать
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #3 : 11-05-2005 06:55 » |
|
Полезность в том, что тебе гарантировано существование единственного экземпляра класса, сколько раз бы его не пытались создавать.
Вот тебе пример из моего наброска сетевой игры в домино. Создается единственный экземпляр коробки костей, из которой потом каждый игрок может брать кости. Если не сделать ее как singleton, есть вероятность, что кто-то создаст себе собственную коробку и получит дубликаты костей.
Колода карт тоже неплохой кандидат на реализацию в виде singleton. Равно как и поток вывода на принтер.
|
|
|
Записан
|
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #4 : 12-05-2005 13:04 » |
|
или еще пример , несколько потоков хотят работать через один порт, неважно какой. При попытке открыть его, им возвращается указатель на один класс. И второго его быть не должно. Этот класс каждый настраивает под себя. Ну и работают себе.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #5 : 13-05-2005 02:05 » |
|
Т.е. как я понял синглетоны имеет смысл использовать только в многопоточных приложениях?
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #6 : 13-05-2005 06:27 » |
|
Вовсе нет. Они совершенно никоим образом не связаны с потоками. Да и обойтись без них в принципе можно, если каждый раз, когда создаешь единственный экземпляр, проверять, не был ли он создан ранее.
Это всего лишь вопрос удобства. Код, контролирующий единственность экземпляра, локализован в объекте, а не раскидан по приложению, поэтому его легче понять и сопровождать.
|
|
|
Записан
|
|
|
|
USBLexus
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #7 : 14-05-2005 03:03 » |
|
Альф Но в случае если поток один, какой это имеет смысл Почему нельзя сделать этот ресурс/класс статически? Тогда не нужно проверять был ли он уже создан или еще нет. Пускай он автоматически создается с главным окном приложения например или с экземпляром приложения и удаляется им же при выходе
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
Alf
Гость
|
|
« Ответ #8 : 14-05-2005 08:15 » |
|
Во-первых, данный класс может оказаться довольно ресурсоемким. Если он не обязательно потребуется при выполнении программы (например, ты только редактировал изображение, а печатать не стал), лучше создавать его лишь при реальной потребности, а не на всякий случай, вдруг пригодится.
Во-вторых, это делает программы надежнее. Если над программой работает десяток человек, причем некоторые из них новички, вероятность получить работоспособный продукт выше, если не полагаться на внимательность кодеров, а изначально писать надежный код. В данном случае автор класса-синглетона гарантирует его корректное поведение даже в случае ошибок клиента.
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #9 : 16-05-2005 08:32 » |
|
Немного вклинюсь не по теме : А где про это почитать по отношению к C# ?
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
xelos
Гость
|
|
« Ответ #10 : 16-05-2005 08:57 » |
|
|
|
|
Записан
|
|
|
|
Alf
Гость
|
|
« Ответ #11 : 16-05-2005 08:59 » |
|
Вообще-то этот паттерн не привязан к конкретному языку, документирована его объектная модель (как и для остальных). С равным успехом ты можешь реализовать его на C++, C#, Java или Smalltalk.
Если установишь себе XDE, то там есть визард для работы с паттернами, достаточно будет лишь выбрать пункт меню.
|
|
|
Записан
|
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #12 : 16-05-2005 11:11 » |
|
Вообще-то этот паттерн не привязан к конкретному языку, документирована его объектная модель (как и для остальных). С равным успехом ты можешь реализовать его на C++, C#, Java или Smalltalk. Если установишь себе XDE, то там есть визард для работы с паттернами, достаточно будет лишь выбрать пункт меню.
Применение патернов в принципе вопрос проектирования а не кодинга. имхо
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #13 : 16-05-2005 13:00 » |
|
Если установишь себе XDE, то там есть визард для работы с паттернами, достаточно будет лишь выбрать пункт меню.
А что такое XDE ?
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Alf
Гость
|
|
« Ответ #14 : 16-05-2005 13:32 » |
|
А что такое XDE ?
Это весьма интересный инструмент для проектирования программ в среде .NET или Java (это две разные версии, если хочешь проектировать в обеих средах, придется качать обе). Используется нотация UML, причем есть как прямое проектирование (из диаграмм UML получаешь код), так и обратное (из готового кода получаешь UML диаграммы). Имеются также средства синхронизации моделей (изменил диаграмму - соответственно меняется код, и наоборот). Помимо прочих разных красивостей, имеется также библиотека паттернов проектирования (те самые, о которых пишут GoF), которая позволяет одним нажатием мышки импортировать наиболее популярные паттерны в свой проект. Есть также инструментарий для отладки и тестирования программ. С ним я пока особенно не разбирался, но с виду инструменты кажутся весьма достойными. Продукт инсталлируется поверх Studio .NET и полностью интегрируется в нее, т.е. вся работа с ним производится посредством дополнительных панелей инструментов, опций меню и контекстного меню непосредственно из IDE Visual Studio .NET. Обрести сие чудо можно здесь: http://www14.software.ibm.com/webapp/download/preconfig.jsp?id=2003-09-18+15%3A02%3A18.447448R&S_TACT=104CBW71&S_CMP=&s=Само собой разумеется, это демо-версия с периодом распада 15 дней. Но после лечения она вполне может подрасти до настоящей, полнофункциональной. По крайней мере, я ей пользуюсь уже несколько месяцев и никаких аномалий не заметил. Из недостатков могу отметить лишь большой объем дистрибутива (под 400 мег, так что для скачивания нужен хороший канал) и прожорливость к процессору и памяти.
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #15 : 16-05-2005 14:01 » |
|
Спасибо за инфу Из недостатков могу отметить лишь большой объем дистрибутива (под 400 мег, так что для скачивания нужен хороший канал) и прожорливость к процессору и памяти.
Ну енто не проблема Пережуём как-нибудь Это ставится накакую студию ? Как я понимаю только на версию не выше 2003 ? Или и на 2005 бету 2 можно поставить ?
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Alf
Гость
|
|
« Ответ #16 : 17-05-2005 06:58 » |
|
Это ставится накакую студию ? Как я понимаю только на версию не выше 2003 ? Или и на 2005 бету 2 можно поставить ? Вот уж чего не знаю, звиняйте... Остается лишь надеяться, что совместимость у них достаточно высокая. Кстати, получил недавно из "Озона" книгу: С.А. Трофимов, "Rational XDE для Visual Studio .NET". Сказать по правде, книга отвратительная, больше похожа на плохо отредактированный перевод справки "Стилусом". Однако других все равно пока не встречал.
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #17 : 17-05-2005 07:26 » |
|
Ну на сайте я нашол только что подходит под студию 7.0 и 7.1
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Alf
Гость
|
|
« Ответ #18 : 17-05-2005 08:26 » |
|
Ну так ясное дело. Не будут же они тестировать на совместимость с бета-версиями, делать им больше нечего...
А ты уже так плотно на 2005 подсел, прежними не пользуешься?
|
|
|
Записан
|
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #19 : 17-05-2005 12:21 » |
|
А ты уже так плотно на 2005 подсел, прежними не пользуешься? Да уж так вышло. Начал я свой проект на 2 бете, а теперь ещё два передали Вот и сижу теперь на 2005
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
LP
Помогающий
Offline
|
|
« Ответ #20 : 25-06-2005 17:05 » |
|
Продолжим что ли о синглтоне... Такой вопрос: а нельзя ли иногда обойтись обычной глобальной переменной вместо синглтона?
|
|
« Последнее редактирование: 25-06-2005 17:07 от LP »
|
Записан
|
Если эта надпись уменьшается, значит ваш монитор уносят
|
|
|
Alf
Гость
|
|
« Ответ #21 : 25-06-2005 22:04 » |
|
Иногда, наверное, можно. Однако singleton - это более общее решение.
Например, может встретиться ситуация, когда объект достаточно громоздкий и при этом не обязательно понадобится в программе. Например, в сложной графической программе присутствует форматировщих для вывода на печать, однако пользователь может достаточно редко выводить изображение на принтер, и создавать его в каждом сеансе не нужно. В этом случае заранее заготовленный глобальный объект съест ресурсы безо всякой пользы.
Другая проблема - помимо глобальной переменной програмист может создать сколько угодно динамических объектов этого же типа в куче. Не всегда это совпадает с планами разработчика объекта.
|
|
|
Записан
|
|
|
|
|