2009-04-06 4 views
12

Не является ли класс со всеми статическими элементами/методами своего рода одноэлементным шаблоном проектирования? Есть ли недостаток, в частности, наличия таких классов? Подробное объяснение поможет.static class and singleton

ответ

17

Этот вид класса известен как monostate - он несколько отличается от одноэлементного.

Зачем использовать моностат, а не синглтон? В их original paper по образцу, Bell & Кроуфорд предложить три reasonns (перефразировать мной):

  • синтаксис более естественный доступ
  • одноточечно отсутствует имя
  • проще унаследовать от

I должен признать, я не нахожу ни одного из них особенно убедительным. С другой стороны, моностат определенно не является хуже, чем синглтон.

+0

Разные да, но не достигает ли он того же? Я не вижу, как это имеет какие-либо преимущества или недостатки в отношении «традиционного» синглтона, по крайней мере, на C++. –

+0

Существует разница в том, что пространство не будет выделено для синглета, если оно не используется, но на практике одноэлементный объект, который никогда не используется, кажется редким случаем. Кто-нибудь имеет общий прецедент, где это важно? –

+0

Я также склонен думать, что функция ленивой конструкции типичных синглетонов в большинстве случаев бесполезна - те, где нам просто нужна глобальная переменная. Однако в случае с библиотекой нам может понадобиться «на лету», чтобы упростить код конечного пользователя (фактически разработчика). –

15

Роберт К. Мартин написал article несколько раз назад о различиях между шаблоном монофонического и одноэлементного рисунка.

+1

Основываясь на этой статье, единственными существенными отличиями, которые я мог видеть, было то, что в Java, уничтожение Monostate гарантировано, но не может быть передано между JVM - существуют ли какие-либо различия, имеющие отношение к C++? –

+0

Это точно так же, как и с другими переменными. Если он динамически распределен, он должен быть освобожден с помощью совместимого деллалокатора. Если он находится в статическом хранилище (см. GOTW/XC++, IIRC), он будет уничтожен и конец программы, но нет возможности реализовать зависимости. –

+0

Что касается аспекта зависимостей, одиночные одиночки Aokandrescu loki (из MC++ D) и синглеты ACE позволяют задавать зависимости. Кстати, они оба являются неинтрузивными одноточечными. –

0

Для singleton все конструкторы должны быть частными, так что вы можете получить доступ только через функцию. Но ты очень близко к нему.

+1

неправильно неправильно. – Thomasz

+0

Если вы действительно думаете, что вам следует снова прочитать о одиночных играх. Частные конструкторы и один или несколько статических членов, доступ к которым только через публичную функцию-член, являются самим определением singleton – DaClown

+1

. Если этот ответ настолько ошибочен, что он заслуживает 5 downvotes, не могли бы вы оставить комментарий почему? Что-то вроде «неправильного неправильного неправильного» не полезно, и я все еще не уверен, что я ошибаюсь. – DaClown

1

класса со всеми статическими членами/методами своего родом одноплодного шаблона дизайна

класса - не шаблон. Когда мы говорим о занятиях, мы можем сказать, что класс реализует узор.


Статические функции - не являются функциями-членами, они похожи на глобальные функции. Может быть, вам не нужен класс?

Цитата wikipedia:

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

По этому определению вашей реализации не синглтон реализации - не использовать общую идею один (или несколько в расширенном определении) экземпляра класса.

Но иногда (не всегда) использование класса со всеми статическими функциями и шаблоном singleton - не имеет значимой разницы.

2

Рассмотрите семейство классов ведения журнала. Все они реализуют «LogMessage (message, file, line_number)). Некоторые отправляют сообщения в stderr, некоторые отправляют электронную почту в набор разработчиков, некоторые увеличивают количество конкретного сообщения в таблице частот сообщений, некоторый маршрут до/dev/null ,Во время выполнения программа проверяет свои переменные вектора вектора, реестра или среды, для которых метод ведения журнала используется и создает экземпляр Logging Singleton с объектом из подходящего класса, возможно, загружая DLL для конечного пользователя, чтобы сделать это. Эта функциональность трудно дублировать с помощью чистого статического синглтона.