Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Масштабирование системы при использовании паттерна Singleton

04.01.2017, 10:51. Показов 4775. Ответов 85
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, как доказать или опровергнуть, что архитектура теряет гибкость и расширяемость при активном использовании паттерна Singleton.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2017, 10:51
Ответы с готовыми решениями:

Насчёт шаблонного паттерна SingleTon
Есть код паттерна template<class T> class Singleton { private: static T* ptr; protected: Singleton();

Необходима альтернатива при использовании Proxy паттерна
Здравствуйте, возникла проблема, которую я так и не придумал, как рационально решить. В общем, задача состояла в том, чтобы отследить...

Реализация паттерна Singleton
Добрый день. Необходимо реализовать класс Storage, объект которого будет единственным в программе. Для достижения данной цели было выбрано...

85
07.01.2017, 00:59
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
Я с cout не понимаю. Будьте добры, внесите немного конкретики.
Когда-то я специально искал какой-нибудь объект из стандартной библиотеки и не нашёл. Хотелось бы чтобы кто-то сказал: -"Дык, зачем такие приблизительные вещи вота же есть и впрямь синглтон!".

0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.01.2017, 01:48
Ясно. Вот, Вы о чём.
Ну, так как конструктор ostream спрятан в protected, то кто-то должен был где-то однажды это сказать.

Хорошо. Есть у нас ненадуманный синглтон, который есть cout.
Какие потребности могли бы возникнуть, чтобы в случае с cout паттерн оказался антипатерном?

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

Если это получится, то, может быть, некоторые неясности с использованием синглтона как-нибудь прояснятся немного.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.01.2017, 02:28
Цитата Сообщение от daslex Посмотреть сообщение
Хорошо. Есть у нас ненадуманный синглтон, который есть cout.
Я рад что Вы поняли. То есть когда есть навороченный шаблон от которого можно унаследовать, инстанцировать и объявить глобальный объект то это на века. А если нужно сегодня и команда не велика, а такого шаблона нет?
Вообще, если что-то, что делается небольшой группой для решения не слишком общей задачи, вдруг станет золотой жилой открытием нового алгоритма и потребует обобщённой редакции, то это большая удача. Тогда и отрефакторить не жалко. Это очень маленькое имхо. Тут не имею опыта.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.01.2017, 02:44
Меня сейчас сломают.

Цитата Сообщение от hoggy Посмотреть сообщение
другой пример:
std::cout - глобальный объект.
но он не является сингелтоном.
нет необходимости делать его класс одиночкой.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
07.01.2017, 03:03
Кто-нибудь может ткнуть пальцем во что-нибудь из STL: "вот ЭТО типичный синглтон"?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.01.2017, 03:04
Цитата Сообщение от gru74ik Посмотреть сообщение
Кто-нибудь может ткнуть пальцем во что-нибудь из STL: "вот ЭТО типичный синглтон"?
Святые слова.
0
07.01.2017, 03:06

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
Меня сейчас сломают.
Береги психику :D

0
07.01.2017, 03:38

Не по теме:

Когда свой мир идей абстрактных
Явил народу грек Платон
В нем, проявляя свой характер,
Уже имелся синглетон!
Он был один такой в том мире
Нет конкурентов - нет проблем!
Не масштабировался шире
На компромисс не шел ни с кем.
Один на всех! Чего же боле?
Что я могу еще сказать?
Стал антипаттерн поневоле
Мог приложение связать
Не слыша доброго совета
Судьбы случайный фаворит
Восстал он против мнений света
Один, как прежде... и delete!
Delete!.. К чему теперь рыданья,
Пустых похвал ненужный хор
И жалкий лепет оправданья?
Судьбы свершился приговор!
Не вы ль сперва так злобно гнали
Его свободный, смелый дар
И для потехи раздували
Чуть затаившийся пожар?
Что ж? Веселитесь... он мучений
Последних вынести не мог:
Угас, как светоч, дивный гений,
Увял торжественный венок.

0
07.01.2017, 03:50

Не по теме:

_Ivana, это из стандарта на русский? Если да, то я зря сетовал на возможные неточности перевода. Каким бы ни был оригинал, - данный вариант лучше. Всё в духе затронутого противоречия: "Погиб объект - невольник чести...". И проблематика актуальна. Delete - настоящее долото. В скрижалях советуют объявить оператор взятия адреса в закрытой секции. От греха.
Не спится? :)

0
07.01.2017, 03:55

Не по теме:

IGPIGP, да, не спится, режим на праздниках совсем сбил :) Сублимируюсь на форуме :)
ЗЫ - про "погиб объект" - это сильно, правка принимается :)

0
07.01.2017, 04:04

Не по теме:

_Ivana,

Цитата Сообщение от _Ivana Посмотреть сообщение
Сублимируюсь на форуме
Хороший стих. Порадовал душу.:yes:
Но пора спатки. Когда думаю, что у вас еще позже чем у нас, ещё больше спать хочется. Спокойной ночи. :friends:

0
07.01.2017, 04:09

Не по теме:

IGPIGP, ну, стих был написан в соавторстве, в полном соответствии с концепцией переиспользования уже написанного - наследование, как оно есть :D О мы, надменные потомки.... помните же? :)
Спокойной ночи :friends:

0
07.01.2017, 10:27

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
О мы, надменные потомки....
А то. Ещё какие. И ведь сами же и страдаем. Паттерн одиночества - удел раздумий. Помните? -
Анчар как мрачный синглтон, стоит один во всей вселенной...
или
К чреслам моим коснулся он,
И вырвал грешный сингл-тон!
:cry:
Хочется как-то оптимистично закончить. Моя печень бесстрашно смотрит на приближение нового, нового года.:D
-Я сабжектник себе воздвиг. Нерукотворный!. :D

Доброе утро! :)

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.01.2017, 10:05
Цитата Сообщение от sys_beginner Посмотреть сообщение
конкретный_тип::getInstance() это всегда зависимость от конкретного типа
вам стоит понять "истинную" природу сингелтона.

берем простейшую модель сингелтона:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
struct singelton
{
    static singelton& get() 
        { static singelton s; return s; }
    
    void work() {}
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    singelton::get().work();
}
и тут мы думаем: а нафига нам постоянно писать через get?
и слегка наносим косметику:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
struct singelton
{
    static void work() { get().work_(); }
    
private:
    static singelton& get() 
        { static singelton s; return s; }
    
    void work_() {}
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    singelton::work();
}
и понимаем: что функционально всё ровно тоже самое,
только клиентам не нужно больше писать вручную get.

вот этот вот дизайн: singelton::work();
вам ничего не напоминает?

я поясню момент:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
namespace singelton
{
    // определение может быть где то в cpp файле
    static void work() {}
    
} // namespace singelton
 
int main()
{
    std::cout << "Hello, world!\n";
    
    singelton::work();
}
по прежнему ничего не изменилось,
ни с точки зрения дизайна,
ни с точки зрения функциональности.

но думаю, теперь вам стало очевидно,
что с технической точки зрения сингелтон ни что иное,
как эквивалент самого обычного сишного модуля.

поэтому я и пишу: зависит от реализации.
если вам так критично избавиться от зависимости от типа - не проблема.

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

Добавлено через 3 минуты
Цитата Сообщение от Nosey Посмотреть сообщение
Читал, но да, вам не нужен сингелтон. особенно не нужен если понятие "Вам" включает работу >10 человек.
количество людей в команде
никак не влияет на нужность/ненужность используемых паттернов.
3
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.01.2017, 11:02
Цитата Сообщение от hoggy Посмотреть сообщение
вам стоит понять "истинную" природу сингелтона.
Браво hoggy, - отличный пример! А главное, это замечательный системный подход, в котором для обоснования ненужности чего-либо требуется сначала уяснить, чем это "что-либо" может быть полезно! В добавок ( если не лучше - само по себе ) можно начать раунд коллективного мышления/творчества.
Я согласен с тем, что статический метод лучше функтора, так как мы можеи определить целый набор. И согласен, что это очень похоже на синглтон. То есть, если нет иных соображений чем упрощение записи, то синглтон мёртв.
Но мне кажется такие соображения есть. Набор статических методов не позволяет пользоваться всеми преимуществами экземпляра класса по определению. А синглтон, - экземпляр по определению. И это его качество и интересно. Чего нельзя сделать без экземпляра? Нельзя, например перегрузить операторы.
Интересно, что ещё может быть тут интересно?
0
08.01.2017, 11:15

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Нельзя, например перегрузить операторы.
http://rextester.com/YAXU24371
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
namespace test
{
    static struct a { static int n; } n;
    int a::n = 10; 
    
    static int operator+(const a& a, double)
    {
        std::cout << "I catch you!\n";
        return a.n + 1;
    }
}
 
int main()
{
    std::cout << test::n + 1.d;
}
:scratch:
Или не это имелось ввиду?

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.01.2017, 11:24
GbaLog-, почему не по теме? Оно конечно не срезонировало с моим постом, но это по теме. Будем считать, что это анти плюсовый манёвр. Не смогу плюсануть. И ладно.
Глобальные операторы или статические, можно перегрузить для экземпляров определённых типов. Но речь же о самом синглтоне. Что если для него, как сущности нужно определить оператор?
Имея класс вообще без экземпляров, но со статическими методами можно упростить запись и пользоваться некоторыми свойствами статического класса синглтона. Но отсутствует возможность использовать сущность как объект класса. Например, нельзя перегрузить для неё операторы.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.01.2017, 11:38
Цитата Сообщение от IGPIGP Посмотреть сообщение
Нельзя, например перегрузить операторы.
ни разу в жизни не возникало такой потребности)))

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

киллер-фича свободной пачки функций жеж - напротив,
в том, что можно всегда создать новый файлик,
объявить такое же пространство имен.
и накатать новых функций.
то есть, как бы расширить функциональность сингелтона.
это достоинство так же является и главным минусом.
можно по итогу получить функциональность разбитую по куче файлов.
и если это чужой проект, и нет нормальной документации,
то становится не очевидным: какое же у нас тут имеется апи.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.01.2017, 12:04
Цитата Сообщение от hoggy Посмотреть сообщение
ни разу в жизни не возникало такой потребности)))
Мне пришлось однажды наткнуться на вот какой вариант. При выделении памяти оператором new мы пишем:
C++
1
T* a = new T(b)
Возможно я и накорулесил, но мне захотелось создать умный указатель, который делает себе и своему объекту "харакири" всякий раз, когда он выходит из области. Но это же нельзя сделать по инструкции! Не писать же каждый раз d.atacci(). Да и при исключениях оно не вызовется. Я не нашёл пути лучше чем перегрузка new и delete для сиглтона который создаёт хранилище указателей на данный тип (я исползовал std::map). То есть сам синглтон в этом разе просто уже нельзя и создать его оператором new (он перегружен выделять не для себя).
То есть, для данного раза подходит только синглтон Майерса (везде ругаемый)).
Вообще трагедиядиалектическая противоречивость синглтона как мне кажется в том, что несмотря на то, что классы - типы для "штамповки" объектов, но в этой среде иногда может быть нужно иметь однородную с объектами классов по природе сущность, но в единственном экземпляре. В этом заключается его нативный антагонизм классам. Но не в том, что он противоречит логике как таковой. Словом, он здорово провоцирует тех кому всегда хочется крикнуть: "Ату его!". Что и говорить.
Поэтому и интересно послушать, что кто скажет.
И сделать так, чтобы и не слишком опытным программерам это было понятно, - как бонус.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.01.2017, 12:11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но это же нельзя сделать по инструкции!
не въехал в суть проблемы)

Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, для данного раза подходит только синглтон Майерса (везде ругаемый)).
почему ругаемый то?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2017, 12:11

Может ли потребоваться применение механизма событий при использовании паттерна MVVM?
Паттерн MVVM провозглашён как базовый паттерн для приложений WPF. В паттерне MVVM используется механизм команд. То есть, если...

Настройка системы при использовании SSD
Здравствуйте. Хотелось бы знать, нужно ли настраивать систему при использовании SSD.

Постоянно прохожу проверку CAPTCHA при использовании поисковой системы
Доброго времени суток. Проблема следующая: при поиске в гугле или яндексе эти поисковые системы постоянно запрашивают пройти проверку...

Collections: singleton/singletonList/singletonMap. Что значит слово singleton?
Заметил, что в классе Collections (утилитный класс) имеются методы для оборачивания элемента в set/list/map Все эти методы содержат в...

Установка "лимита" на значение решения системы ОДУ при использовании решателя ode45
Добрый день. Есть такая задачка: при решении системы дифференциальных уравнений, пусть одно из решений имеет величину, условно говоря, с 1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru