Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Кто где и как использовал синглетоны  (Прочитано 22857 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Большой босс

ru
Offline Offline
78


« Ответ #4 : 12-05-2005 13:04 » 

или еще пример , несколько потоков хотят работать через один порт, неважно какой. При попытке открыть его, им возвращается указатель на один класс. И второго его быть не должно. Этот класс каждый настраивает под себя. Ну и работают себе. Улыбаюсь
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
USBLexus
Опытный

ru
Offline 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
Опытный

ru
Offline 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
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #9 : 16-05-2005 08:32 » 

Немного вклинюсь не по теме : А где про это почитать по отношению к C# ?
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
xelos
Гость
« Ответ #10 : 16-05-2005 08:57 » 

реализация основных паттернов на C#:
http://www.dofactory.com/Patterns/Patterns.aspx
на www.c-sharpcorner.com/ было еще
Записан
Alf
Гость
« Ответ #11 : 16-05-2005 08:59 » 

Вообще-то этот паттерн не привязан к конкретному языку, документирована его объектная модель (как и для остальных). С равным успехом ты можешь реализовать его на C++, C#, Java или Smalltalk.

Если установишь себе XDE, то там есть визард для работы с паттернами, достаточно будет лишь выбрать пункт меню.
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #12 : 16-05-2005 11:11 » 

Вообще-то этот паттерн не привязан к конкретному языку, документирована его объектная модель (как и для остальных). С равным успехом ты можешь реализовать его на C++, C#, Java или Smalltalk.
Если установишь себе XDE, то там есть визард для работы с паттернами, достаточно будет лишь выбрать пункт меню.
Применение патернов в принципе вопрос проектирования а не кодинга. имхо
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #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
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #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
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #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
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #19 : 17-05-2005 12:21 » 

А ты уже так плотно на 2005 подсел, прежними не пользуешься?
Да уж так вышло. Начал я свой проект на 2 бете, а теперь ещё два передали Жаль Вот и сижу теперь на 2005 Улыбаюсь
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
LP
Помогающий

ru
Offline Offline

« Ответ #20 : 25-06-2005 17:05 » 

Продолжим что ли о синглтоне... Такой вопрос: а нельзя ли иногда обойтись обычной глобальной переменной вместо синглтона?
« Последнее редактирование: 25-06-2005 17:07 от LP » Записан

Если эта надпись уменьшается, значит ваш монитор уносят
Alf
Гость
« Ответ #21 : 25-06-2005 22:04 » new

Иногда, наверное, можно. Однако singleton - это более общее решение.

Например, может встретиться ситуация, когда объект достаточно громоздкий и при этом не обязательно понадобится в программе. Например, в сложной графической программе присутствует форматировщих для вывода на печать, однако пользователь может достаточно редко выводить изображение на принтер, и создавать его в каждом сеансе не нужно. В этом случае заранее заготовленный глобальный объект съест ресурсы безо всякой пользы.

Другая проблема - помимо глобальной переменной програмист может создать сколько угодно динамических объектов этого же типа в куче. Не всегда это совпадает с планами разработчика объекта.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines