Я был сбит с толку, когда впервые увидел анти-синглтонные комментарии. Я использовал шаблон singleton в некоторых недавних проектах, и он прекрасно работал. Настолько, что я использовал его много-много раз.
Теперь, столкнувшись с некоторыми проблемами, прочтите этот вопрос SO, и особенно это сообщение блога, я понимаю зло, которое я принес в мир.
Итак: как мне удалить синглтоны из существующего кода?
Например:
В программе управления розничным магазином я использовал шаблон MVC. Объекты My Model описывают хранилище, пользовательский интерфейс - это View, и у меня есть набор контроллеров, которые действуют как связующее звено между ними. Здорово. За исключением того, что я сделал Store одноэлементным (поскольку приложение всегда управляет только одним магазином за раз), и я также превратил большинство моих классов Controller в синглтоны (один mainWindow, один menuBar, один productEditor ...). Теперь большинство моих классов Controller получают доступ к другим синглетонам следующим образом:
Store managedStore = Store::getInstance();
managedStore.doSomething();
managedStore.doSomethingElse();
//etc.
Должен ли я вместо этого:
- Create one instance of each object and pass references to every object that needs access to them?
- Use globals?
- Something else?
Глобалы все равно плохи, но по крайней мере они не будут притворяется.
Я вижу, что №1 быстро приводит к ужасно раздутым вызовам конструкторов:
someVar = SomeControllerClass(managedStore, menuBar, editor, sasquatch, ...)
Кто-нибудь еще прошел через это? Как объектно-ориентированный способ предоставить многим отдельным классам доступ к общей переменной, не являясь глобальной или синглетной?