Не является ли класс со всеми статическими элементами/методами своего рода одноэлементным шаблоном проектирования? Есть ли недостаток, в частности, наличия таких классов? Подробное объяснение поможет.static class and singleton
ответ
Этот вид класса известен как monostate - он несколько отличается от одноэлементного.
Зачем использовать моностат, а не синглтон? В их original paper по образцу, Bell & Кроуфорд предложить три reasonns (перефразировать мной):
- синтаксис более естественный доступ
- одноточечно отсутствует имя
- проще унаследовать от
I должен признать, я не нахожу ни одного из них особенно убедительным. С другой стороны, моностат определенно не является хуже, чем синглтон.
Роберт К. Мартин написал article несколько раз назад о различиях между шаблоном монофонического и одноэлементного рисунка.
Основываясь на этой статье, единственными существенными отличиями, которые я мог видеть, было то, что в Java, уничтожение Monostate гарантировано, но не может быть передано между JVM - существуют ли какие-либо различия, имеющие отношение к C++? –
Это точно так же, как и с другими переменными. Если он динамически распределен, он должен быть освобожден с помощью совместимого деллалокатора. Если он находится в статическом хранилище (см. GOTW/XC++, IIRC), он будет уничтожен и конец программы, но нет возможности реализовать зависимости. –
Что касается аспекта зависимостей, одиночные одиночки Aokandrescu loki (из MC++ D) и синглеты ACE позволяют задавать зависимости. Кстати, они оба являются неинтрузивными одноточечными. –
Для singleton все конструкторы должны быть частными, так что вы можете получить доступ только через функцию. Но ты очень близко к нему.
неправильно неправильно. – Thomasz
Если вы действительно думаете, что вам следует снова прочитать о одиночных играх. Частные конструкторы и один или несколько статических членов, доступ к которым только через публичную функцию-член, являются самим определением singleton – DaClown
. Если этот ответ настолько ошибочен, что он заслуживает 5 downvotes, не могли бы вы оставить комментарий почему? Что-то вроде «неправильного неправильного неправильного» не полезно, и я все еще не уверен, что я ошибаюсь. – DaClown
класса со всеми статическими членами/методами своего родом одноплодного шаблона дизайна
класса - не шаблон. Когда мы говорим о занятиях, мы можем сказать, что класс реализует узор.
Статические функции - не являются функциями-членами, они похожи на глобальные функции. Может быть, вам не нужен класс?
Цитата wikipedia:
В программной инженерии, одноточечное шаблон является шаблоном, который используется для ограничения экземпляра в класса к одному объекту.
По этому определению вашей реализации не синглтон реализации - не использовать общую идею один (или несколько в расширенном определении) экземпляра класса.
Но иногда (не всегда) использование класса со всеми статическими функциями и шаблоном singleton - не имеет значимой разницы.
Рассмотрите семейство классов ведения журнала. Все они реализуют «LogMessage (message, file, line_number)). Некоторые отправляют сообщения в stderr, некоторые отправляют электронную почту в набор разработчиков, некоторые увеличивают количество конкретного сообщения в таблице частот сообщений, некоторый маршрут до/dev/null ,Во время выполнения программа проверяет свои переменные вектора вектора, реестра или среды, для которых метод ведения журнала используется и создает экземпляр Logging Singleton с объектом из подходящего класса, возможно, загружая DLL для конечного пользователя, чтобы сделать это. Эта функциональность трудно дублировать с помощью чистого статического синглтона.
Разные да, но не достигает ли он того же? Я не вижу, как это имеет какие-либо преимущества или недостатки в отношении «традиционного» синглтона, по крайней мере, на C++. –
Существует разница в том, что пространство не будет выделено для синглета, если оно не используется, но на практике одноэлементный объект, который никогда не используется, кажется редким случаем. Кто-нибудь имеет общий прецедент, где это важно? –
Я также склонен думать, что функция ленивой конструкции типичных синглетонов в большинстве случаев бесполезна - те, где нам просто нужна глобальная переменная. Однако в случае с библиотекой нам может понадобиться «на лету», чтобы упростить код конечного пользователя (фактически разработчика). –