статический класс и синглтон - PullRequest
12 голосов
/ 06 апреля 2009

Разве класс со всеми статическими элементами / методами не является своеобразным шаблоном проектирования? Есть ли недостаток, в частности, наличие таких классов? Подробное объяснение поможет.

Ответы [ 5 ]

17 голосов
/ 06 апреля 2009

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

Зачем использовать моностат, а не синглтон? В их оригинальной статье о схеме Белл и Кроуфорд предлагают три причины (перефразированные мной):

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

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

15 голосов
/ 06 апреля 2009

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

2 голосов
/ 06 апреля 2009

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

1 голос
/ 06 апреля 2009

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

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


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

Цитата из Википедии :

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

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

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

0 голосов
/ 06 апреля 2009

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

...