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