Ответил на похожий вопрос несколько дней назад здесь, издеваясь над синглтоном . Оригинальный пост предназначен для C # .Net в отношении насмешек над поведением одиночки, но все равно должен применяться.
Что касается шаблона синглтона, то в этом нет ничего плохого как такового - во многих случаях мы хотим централизовать логику и данные. Однако между одноэлементным и статическим классом существует очень большая разница. Создание вашего синглтона в виде статического класса жестких кодов, которые реализуются для каждого потребителя в вашем приложении - что делает модульное тестирование очень трудным!
То, что вы хотите сделать, это определить интерфейс для вашего синглтона, раскрывая методы для ваших потребителей. В свою очередь, ваши потребители передают ссылку на реализующий класс, кем бы он ни был создан (обычно это ваше приложение или контейнер, если вы знакомы с внедрением зависимостей \ инверсией управления].
Именно эта структура, кто бы ни создавал экземпляры для потребителей, отвечает за обеспечение плавания одного и только одного экземпляра. Это на самом деле не очень большой переход от статического класса к интерфейсу [как показано в ссылке выше], вы просто теряете удобство глобально доступного экземпляра - я знаю, я знаю, глобальные ссылки ужасно соблазнительны, но Люк повернулся спиной к Темная сторона, ты тоже можешь!
Вообще говоря, лучшие практики предлагают избегать статических ссылок и поощряют программирование интерфейсов. Помните, что с этими ограничениями все еще можно применять шаблон синглтона. Следуйте этим рекомендациям, и у вас не должно быть проблем с модульным тестированием вашей работы:)
Надеюсь, это поможет!
синглтон! = Открытый статический класс , а точнее синглтон == одиночный экземпляр