Шаблон проектирования Singleton (одиночка), подбираю подходящий для моей задачи |
Здравствуйте, гость ( Вход | Регистрация )
Шаблон проектирования Singleton (одиночка), подбираю подходящий для моей задачи |
ViGOur |
5.5.2008, 10:39
Сообщение
#11
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Для этого и существуют такие директивы препороцессора как:
|
|
|
Litkevich Yuriy |
5.5.2008, 10:42
Сообщение
#12
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
хе, правильно хидер то один и тот же, туплю
|
|
|
Tonal |
5.5.2008, 11:02
Сообщение
#13
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Обычно синглетон (одиночка) без FreeInstance и без подсчёта ссылок пишется.
Простейший:
Мне кажется, он хорошо подойдёт, т.к. те проблемы, которые он имеет, в данном случае не существенны. Собственно проблемы: 1) Возможные гонки потоков при создании. Решаются или более хитрым методом instance - с правильными блокировками, или принудительным созданием до запуска потоков. 2) Обращение к разрушенному объекту. Когда кто-нибудь пытается обратится к instance, когда inst уже разрушен. Т.к. разрушается экземпляр такого одиночки после выхода из main, то такое может происходить, только если обращение идёт из деструкторов других глобальных объектов. Решение - или запретить такие обращения, или создавать одиночку в куче и никогда не убивать (хорошо описано у Александреску). 3) Неясный порядок разрушения. Когда такой одиночка захватывает ресурсы время жизни которых завязано на другие ресурсы, неподконтрольные одиночке - например он держит открытый запрос, а конектом к базе занимается приложение. Решение - не делать так! Другое решение - предоставить метод очистки, который должен вызываться перед закрытием коннекта к базе. После закрытия, или возвращать признак ошибки, либо брасать исключение (может быть опасно если вылетит в деструкторе), либо возвращать заглушки. Сообщение отредактировал Tonal - 5.5.2008, 11:04 |
|
|
Litkevich Yuriy |
5.5.2008, 11:12
Сообщение
#14
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Andrew Selivanov |
5.5.2008, 11:19
Сообщение
#15
|
Участник Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: 6 |
хе, правильно хидер то один и тот же, туплю Посмотри книгу Modern C++ Design: Generic Programming and Design Patterns Applied By Andrei Alexandrescu. Там все очень хорошо про singleton-ы и прочие шаблоны расписано. О, оказывается она у меня есть на русском Кому надо вышлю в приват. |
|
|
Litkevich Yuriy |
5.5.2008, 11:25
Сообщение
#16
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
у меня есть Эрих Гамма, там тоже есть примеры, но пока для меня это ново и требует время на переваривание, тем более, что я незнаю как лучше применить этот шаблон, толи сделать его универсальным, в отдельном модуле в виде шаблонного класса, и потом делать от него наследование, либо сделать класс только для моей задачи, но если мне опять понадобится "одиночка" писать заново.
|
|
|
ViGOur |
5.5.2008, 11:44
Сообщение
#17
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
|
|
|
Litkevich Yuriy |
5.5.2008, 11:45
Сообщение
#18
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
да, про конструктор/деструктор я понял, это чтоб никто не мог создать дубликат
|
|
|
Litkevich Yuriy |
5.5.2008, 12:29
Сообщение
#19
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Например, в Qt'ях я применяю такую строку:
Если я ни где не создаю экземпляр класса QTextCodec, то можно ли пользоватся таким вариантом в место "одиночки"? Правильно ли я понял, что "одиночка" спасает от "случайного" создания/удаления экземпляра? |
|
|
ViGOur |
5.5.2008, 12:42
Сообщение
#20
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Тот пример, что ты привел, обычная статическая функция.
Класс одиночка - это класс для которого можно создать только один объект... |
|
|
Текстовая версия | Сейчас: 29.11.2024, 0:19 |