Справочная информация: у меня есть несколько классов, реализующих шаблон проектирования субъекта / наблюдателя, который я сделал потокобезопасным. subject
уведомит его observers
простым вызовом метода observer->Notified( this )
, если observer
был создан в том же потоке, что и уведомление. Но если observer
был создан в другом потоке, то уведомление будет опубликовано на queue
для последующей обработки потоком, который сконструировал observer
, и тогда простой вызов метода может быть выполнен, когда событие уведомления обрабатывается.
Итак ... У меня есть карта, связывающая потоки и очереди, которая обновляется, когда потоки и очереди создаются и уничтожаются. Эта карта сама по себе использует мьютекс для защиты многопоточного доступа к ней.
Карта является одиночной.
В прошлом я был виновен в использовании синглетонов, потому что «в этом приложении будет только один», и, поверьте мне, я заплатил покаяние!
Одна часть меня не может не думать, что в приложении действительно будет только одна карта очередей / потоков. Другой голос говорит, что синглтоны не хороши, и вы должны избегать их.
Мне нравится идея удаления синглтона и возможности заглушить его для моих юнит-тестов. Проблема в том, что мне трудно найти хорошее альтернативное решение.
«Обычное» решение, которое работало в прошлом, состоит в том, чтобы передать указатель на объект для использования вместо ссылки на синглтон. Я думаю, что в этом случае было бы сложно, поскольку в моем приложении наблюдатели и субъекты стоят по 10 копеек, и было бы очень неудобно передавать объект карты очереди / потока в конструктор каждого отдельного наблюдателя.
Что я ценю, так это то, что у меня вполне может быть только одна карта в моем приложении, но она не должна быть в недрах кода субъекта и класса наблюдателя, где принимается это решение.
Может быть, это действительный синглтон, но я также буду признателен за любые идеи о том, как я могу удалить его.
Спасибо.
PS. Я прочитал Что является альтернативой синглтону и Эта статья упоминается в принятом ответе. Я не могу не думать, что ApplicationFactory это просто еще один синглтон под другим именем. Я действительно не вижу преимущества.