Я был смущен, когда впервые начал видеть комментарий против синглтона. Я использовал шаблон singleton в некоторых недавних проектах, и он отлично работал. На самом деле так много, что я использовал его много раз.
Теперь, столкнувшись с некоторыми проблемами, прочитав этот вопрос SO, и особенно this сообщение в блоге, я понимаю зло, которое я принес в мир.
Итак: Как мне обойти удаление синглетонов из существующего кода?
Например:
В программе управления розничным магазином я использовал шаблон MVC. Объекты My Model описывают хранилище, пользовательский интерфейс - это View, и у меня есть набор контроллеров, которые действуют как лизатор между ними. Отлично. За исключением того, что я сделал Store в одноэлементное (поскольку приложение управляет только одним магазином за раз), я также использовал большинство моих классов Controller в одноэлементных (один основной, один menuBar, один productEditor...). Теперь большинство моих классов Controller получают доступ к другим синглонам следующим образом:
Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.
Должен ли я вместо этого:
- Создайте один экземпляр каждого объекта и передайте ссылки на каждый объект, который нуждается в доступе к ним.
- Использовать глобальные переменные?
- Что-то еще?
Глобалы все равно будут плохими, но по крайней мере они не будут притворяться.
Я вижу # 1, что быстро приводит к ужасно раздутым вызовам конструктора:
someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
Кто-нибудь еще прошел через это? Каков способ OO, позволяющий многим отдельным классам присоединиться к общей переменной, не будучи глобальным или одиночным?