Статический класс и синглтон

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

6 ответов

Решение

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

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

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

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

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

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

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

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

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


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

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

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

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

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

Из книги « Шаблоны проектирования» GoF , глава «Синглтон»:

  1. Более гибкий, чем операции класса.Другой способ упаковать функциональность синглтона - использовать операции класса (то есть статические функции-члены в C++ или методы класса в Smalltalk). Но оба этих языковых метода затрудняют изменение дизайна, чтобы разрешить более одного экземпляра класса. Более того, статические функции-члены в C++ никогда не бывают виртуальными, поэтому подклассы не могут их полиморфно переопределить.
Другие вопросы по тегам