Синглтоны не являются обязательно проблемами - наличие одного объекта, который является экспертом в своей области, может быть очень полезным, но явное кодирование одиночного объекта в объект почти всегда является плохой идеей (и частотоже плохо сделано).Оказывается, что лучше оставить конфигурацию приложения - включая решение о том, какие классы имеют одноэлементные экземпляры - отдельному слою, который специализируется на этом, например Spring for Java.Таким образом, уровень управления может следить за тем, что является одноэлементным, что является одноэлементным в конкретном контексте (например, в рамках сеанса), и что всегда необходимо создавать заново.Это дает вам возможность сосредоточиться на написании бизнес-логики.
В качестве примера того, почему одиночные пакеты могут быть проблемами и почему они должны быть одиночными по управлению / конфигурации, рассмотрим класс, который управляет подключением к базе данных.Классический чехол для синглтона можно сказать.Вы тоже будете правы, пока не обнаружите, что ваше приложение выросло до такой степени, что оно должно интегрировать соединения с двумя базами данных (это случается!), И тогда вам придется распутывать весь беспорядок.Если вы сохранили свой код независимо от того, имеет ли он дело с синглетами или нет, у вас есть прекрасная возможность справиться со всем этим, просто переконфигурировав;некоторые классы будут подключены к одной БД, а другие - к другой, но они просто будут с этим справляться с минимальными усилиями.(Все, что нуждается в обоих… ну, поэтому я сказал «отличный шанс».)
Еще один пример того, почему у Singletons могут быть проблемы, приходит, когда вы пишете тесты для своего кода.(Вы пишете тесты, да?) Явные синглтоны очень сложно тестировать, так как их сложно настроить и сложно изолировать.Вы не можете разорвать их между тестами, потому что это подразумевает, что их много.Если ваше приложение использует синглтоны только по конфигурации, конфигурация тестирования может легко изменить это, и вы можете выполнять свои тесты гораздо проще.