Правильное использование шаблона проектирования Singleton - PullRequest
8 голосов
/ 03 января 2012

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

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

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

Любая обратная связь с благодарностью.

1 Ответ

7 голосов
/ 03 января 2012

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

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

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

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