Модель Singleton потеряла большую часть своего блеска в последние годы, в основном из-за роста юнит-тестирования.
Синглтоны могут сделать модульное тестирование очень трудным - если вы можете когда-либо создать только один экземпляр, как вы можете написать тесты, которые требуют «свежих» экземпляров тестируемого объекта? Если один тест каким-либо образом изменяет этот синглтон, любые дальнейшие тесты с тем же объектом на самом деле не начинаются с чистого листа.
Синглтоны также проблематичны, потому что они фактически являются глобальными переменными. У нас была проблема с многопоточностью несколько недель назад в моем офисе из-за глобализации Singleton, который изменялся из разных потоков; разработчик был ослеплен использованием санкционированного «шаблона», не понимая, что то, что он действительно создает, является глобальной переменной.
Другая проблема заключается в том, что в определенных ситуациях может быть патологически сложно создавать настоящие синглтоны. Например, в Java можно создать несколько экземпляров «синглтона», если вы неправильно реализуете метод readResolve()
для сериализуемых классов.
Вместо создания Singleton рассмотрите возможность предоставления статического фабричного метода, который возвращает экземпляр; это, по крайней мере, дает вам возможность передумать, не нарушая своего API.
Джош Блох хорошо обсуждает это в Effective Java .