Шаблон singleton существует, поскольку существуют ситуации, когда для предоставления набора услуг необходим один объект .
Даже если это так, я все еще рассматриваю подход создания синглетонов с использованием глобального статического поля / свойства , представляющего экземпляр, неуместным. Это неуместно, поскольку создает в коде зависимость между статическим полем и объектом, а не услугами, предоставляемыми объектом.
Таким образом, вместо классического одноэлементного шаблона, я рекомендую использовать сервисный шаблон «как» с обслуживаемыми контейнерами , где вместо использования вашего синглтона через статическое поле вы получаете ссылку на него через метод, запрашивающий тип требуемой услуги.
*pseudocode* currentContainer.GetServiceByObjectType(singletonType)
//Under the covers the object might be a singleton, but this is hidden to the consumer.
вместо одного глобального
*pseudocode* singletonType.Instance
Таким образом, когда вы хотите изменить тип объекта с одноэлементного на какой-то другой, вам будет легко и просто сделать это. Кроме того, в качестве дополнительного преимущества вам не нужно передавать множество экземпляров объекта каждому методу.
Также см. Инверсия управления , идея в том, что, выставляя синглеты непосредственно потребителю, вы создаете зависимость между потребителем и экземпляром объекта, а не предоставляемыми сервисами объекта у объекта.
Мое мнение состоит в том, чтобы скрывать использование шаблона синглтона всякий раз, когда это возможно, потому что не всегда возможно избежать его или желательно.