Вопрос

Или лучше использовать другой шаблон проектирования?

Это было полезно?

Решение

Ответил на похожий вопрос несколько дней назад здесь, издеваясь синглтон . Оригинальный пост предназначен для C # .Net в отношении насмешек над поведением одиночки, но все равно должен применяться.

Что касается шаблона синглтона, в нем нет ничего плохого как такового - во многих случаях мы хотим централизовать логику и данные. Однако между одноэлементным и статическим классом существует очень большая разница. Создание вашего синглтона как статического класса жестких кодов, которые реализуются для каждого потребителя в вашем приложении - что делает модульное тестирование очень трудным!

То, что вы хотите сделать, - это определить интерфейс для вашего синглтона, раскрывая методы для ваших потребителей. В свою очередь, ваши потребители передают ссылку на реализующий класс, кем бы он ни был создан (обычно это ваше приложение или контейнер, если вы знакомы с внедрением зависимостей \ инверсией управления].

Именно эта структура, кто бы ни создавал экземпляры для потребителей, отвечает за то, чтобы один и только один экземпляр перемещался. Это на самом деле не очень большой переход от статического класса к интерфейсу [как показано в ссылке выше], вы просто теряете удобство глобально доступного экземпляра - я знаю, я знаю, глобальные ссылки ужасно соблазнительны, но Люк повернулся спиной к Темная сторона, как и ты!

Вообще говоря, лучшие практики предлагают избегать статических ссылок и поощряют программирование интерфейсов. Помните, что с этими ограничениями все еще можно применять шаблон синглтона. Следуйте этим рекомендациям, и у вас не должно быть проблем с модульным тестированием вашей работы:)

Надеюсь, это поможет!

<Ч>

singleton! = открытый статический класс , скорее singleton == одиночный экземпляр

Другие советы

Отсутствие тестируемости является одним из основных недостатков классической модели Singleton (метод статического класса, возвращающий экземпляр). Насколько мне известно, этого достаточно для того, чтобы перепроектировать любой код, использующий Singletons, для использования другого дизайна.

Если вам абсолютно необходимо иметь отдельный экземпляр, тогда внедрение Dependency Injection и запись в интерфейс, как предлагает Джонни g, определенно являются подходящим вариантом.

Я использую следующий шаблон когда я пишу статические синглтоны, которые я могу издеваться. Код Java, но я думаю, вы поймете. Основная проблема с этим подходом заключается в том, что вы должны перевести конструктор в пакетный режим (который побеждает настоящий синглтон). В качестве дополнительного примечания: код относится к возможности имитации вашей " статической " код не обязательно просто называть его

Обычно я использую Singletons только для объектов Flyweight или похожих объектов. Просмотр контейнера IoC (как обсуждалось выше), вероятно, является лучшим способом обработки общего объекта, чем одноэлементный.

Учтите, что в Smalltalk (где возникло много этих шаблонов) true и false были по сути одинаковыми:)

Если вы должны использовать синглтон (и для этого есть причины ... но я всегда буду стараться избегать его, если это возможно). Я бы порекомендовал использовать контейнер IOC для управления им. Я не уверен, есть ли один для Delphi или нет. Но в Java вы можете использовать Spring, в .NET вы можете использовать Windsor / Castle. Контейнер IOC может содержать Singleton и может регистрировать различные реализации для тестирования.

Это, вероятно, слишком большой предмет, чтобы проникнуть сюда за пределы этого фрагмента.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top