Почему мы должны рассматривать класс «Logger» как синглтон? - PullRequest
9 голосов
/ 03 ноября 2010

Мы все знаем о журнале, хорошо, но почему мы должны считать класс «Logger» одноэлементным? Что произойдет, если мы сделаем это как обычный не -инглтон-класс?

Ответы [ 4 ]

14 голосов
/ 03 ноября 2010

Я нашел это здесь на сайте IBM.Это довольно хорошо объясняет использование класса Logger Singleton.

Классическим примером настоящего синглтона является служба регистрации.Предположим, у нас есть служба ведения журнала на основе событий: клиентские объекты запрашивают запись текста, отправляя сообщение в службу ведения журнала.Другие объекты на самом деле записывают текст где-то (консоль, файл, что угодно), слушая службу регистрации этих запросов на регистрацию и обрабатывая их.Во-первых, обратите внимание, что служба ведения журнала проходит классический тест на наличие одноэлементного:

  • Запрашивающим нужен хорошо известный объект для отправки запросов на регистрацию.Это означает глобальную точку доступа.
  • Поскольку служба ведения журнала является единственным источником событий, для которого могут регистрироваться несколько слушателей, необходим только один экземпляр.

Вот ссылка: Используйте ваши синглеты с умом

Если вы не используете одноэлементный класс, вам придется иметь дело с синхронизацией (запись в файл или любой поток, который вы используете) междуэти разные экземпляры регистратора.Так что намного проще, когда у вас есть только один глобальный экземпляр Logger.

4 голосов
/ 03 ноября 2010

Основная проблема заключается в том, где фактический журнал сохраняется.

Если вы пишете в файловой системе, наличие более одного экземпляра (и, следовательно, возможно, более одного потока) может привести к искаженному файлу,

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

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

2 голосов
/ 03 ноября 2010

Если у вас есть несколько потоков журналов с различным содержимым, вы можете использовать несколько экземпляров класса регистратора, инициализированных для разных выходов.

Однако, если у вас есть только один поток журнала, наличие нескольких экземпляров класса регистратора приводит к более сложной реализации, так как экземплярам приходится работать вместе для управления реальным ресурсом. Рассмотрим, например, регистратор, который регистрирует каждое сообщение с порядковым номером. Два экземпляра должны будут синхронизировать свои счетчики последовательности, что требует, чтобы они знали друг о друге, договаривались об увеличении счетчика и так далее. (Альтернатива наличия общего счетчика в статическом члене класса эквивалентна наличию одноэлементного регистратора)

0 голосов
/ 03 ноября 2010

Зависит от структуры ведения журнала. Обычно вы хотите, чтобы все сообщения попадали в один журнал, поэтому вы хотите, чтобы весь код использовал один и тот же регистратор. Но класс logger не обязательно должен быть одноэлементным, чтобы гарантировать, что.

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