Почему синглтон лучше, чем глобальные объекты

Привет, переполнение стека.

Я готовлюсь к экзамену по CS, который у меня завтра, и просматриваю обзорный лист, который нам предоставил наш профессор. Один из пунктов говорит о том, почему Singleton - лучший выбор, чем Global.

Я не совсем уверен в рассуждениях, но помню, как он что-то говорил о синглтоне, использующем меньшее «загрязнение пространства имен». Я сделал несколько поисков в Google, сравнивая Singleton и Global, но почти все результаты показали, что оба варианта - плохие, lol. Так что это меня больше сбивало с толку.

Если кто-нибудь может помочь мне прояснить это, я буду очень признателен. Спасибо!


person ModdedLife    schedule 04.03.2013    source источник
comment
Однако синглтоны являются глобальными объектами. Это все равно, что спрашивать, почему методы лучше, чем функции-члены.   -  person Pubby    schedule 04.03.2013
comment
Что ж, есть фиаско с инициализацией статического ордера, которое обескураживает , но ни то, ни другое не является отличным.   -  person Stephen Lin    schedule 04.03.2013
comment
@Pubby Я полагаю, он имеет в виду лениво сконструированные синглтоны по сравнению со статически сконструированными глобальными объектами.   -  person Stephen Lin    schedule 04.03.2013
comment
Хм. В обзорном листе говорится, что Singleton использует меньше загрязнения пространства имен. Почему лучше Global?   -  person ModdedLife    schedule 04.03.2013
comment
А, нашел.   -  person chris    schedule 04.03.2013
comment
Я не согласен с использованием меньшего загрязнения пространства имен. Конечно, есть еще одно имя для глобального или одноэлементного класса. Имена могут быть разными, но все же это одно и то же имя, которое потенциально может вступить в противоречие с другим. Но если это тот ответ, который требует ваш репетитор, запомните его.   -  person Mats Petersson    schedule 04.03.2013
comment
@ModdedLife Вы создаете один именованный глобальный объект, содержащий набор значений и функций, вместо набора функций и значений, каждое из которых имеет собственное глобально доступное имя.   -  person weltraumpirat    schedule 04.03.2013
comment
@weltraumpirat Хорошо, это определенно помогает. Спасибо.   -  person ModdedLife    schedule 04.03.2013
comment
@weltraumpirat Да, но вы получите тот же эффект [при условии, что функции и значения принадлежат друг другу] от наличия одного глобального объекта с методами и переменными-членами, который также имеет только одно глобально видимое имя.   -  person Mats Petersson    schedule 04.03.2013
comment
@MatsPetersson Это не совсем тот же эффект - синглтон привязан к своему классу, тогда как глобальный объект просто существует свободно. Но в остальном, конечно, вы правы.   -  person weltraumpirat    schedule 04.03.2013


Ответы (1)


Они лениво построены:

LargeObject   global;                    // Large object is always constructed.

class LargeObject_Singelton
{
    public: static LargeObject& getInstance()
    {
        static LargeObject  instance;     // This object is not created until the first
        return instance;                  // time getInstance() is called.
    }                                     // If you never use it this can be important.
};
person Martin York    schedule 04.03.2013
comment
Хм. Не могли бы вы объяснить немного подробнее? - person ModdedLife; 04.03.2013
comment
Может быть ленивым. Ленивое построение на самом деле является проблемой, если к ним может обращаться более одного потока (поскольку вам нужен другой глобальный объект для блокировки первого вызова экземпляра). - person john.pavan; 04.03.2013
comment
@ john.pavan: Неправда в C ++ 11 и в C ++ 03 gcc, это не было проблемой. В C ++ 03 в DevStuio некоторая работа работает, но не является серьезной проблемой: stackoverflow.com/a/449823/14065 - person Martin York; 04.03.2013
comment
@ModdedLife: Не знаю, что еще сказать. Всегда создается глобальное. Синглтон создается только тогда, когда он вам нужен. Если стоимость создания объекта велика, вы можете не захотеть создавать объект, если он вам не нужен. - person Martin York; 04.03.2013
comment
Ленивая конструкция означает, что они создаются при первом вызове функции экземпляра. Это отличается от глобальных глобальных переменных b / c (и статических переменных-членов), которые создаются перед запуском каких-либо потоков. Ленивая природа дает вам контроль над порядком инициализации (просто ссылайтесь на каждый экземпляр синглтона в правильном порядке в начале вашего основного потока). - person john.pavan; 04.03.2013
comment
И есть преимущество в ленивой конструкции только в том случае, если объект используется редко - это имело бы смысл для такой функции, как Print в программе WordProcessing, но не для функций Open и Save [не то, чтобы любые из них были бы одиночными в разумном программа - но я думаю, что это разъясняет суть]. - person Mats Petersson; 04.03.2013
comment
Я бы сказал, что если есть большой объект, который не всегда нужен, вы захотите удалить его в какой-то момент. - person john.pavan; 04.03.2013
comment
@ john.pavan: Singelton правильно уничтожается после завершения программы. И зачем вам разрушать то, что создавать дорого? Это просто означает, что вам придется снова заплатить. Весь смысл ленивой оценки заключается в том, чтобы указать стоимость (если она вам не нужна, не платите). - person Martin York; 04.03.2013