Что является альтернативой синглтон - PullRequest
113 голосов
/ 19 августа 2009

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

Без синглтона мы должны передавать экземпляр везде в нашем коде. Это становится настолько грязным, поэтому мы написали обертку-одиночку. Теперь мы портируем один и тот же код на PHP и .NET, мне интересно, есть ли лучший шаблон, который мы можем использовать для объекта конфигурации.

Ответы [ 13 ]

0 голосов
/ 19 августа 2009

Зависит от того, какие инструменты / рамки и т. Д. Используются. С помощью инструментов внедрения зависимостей / ioc часто можно добиться однозначной производительности / оптимизаций, если контейнер di / ioc использует одноэлементное поведение для требуемого класса (например, интерфейс IConfigSettings), создавая только один экземпляр класса. Это все еще можно заменить на тестирование

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

0 голосов
/ 19 августа 2009

Может быть, не очень чистый, но вы можете передать информационные биты, которые вы хотите изменить, в метод, который создает синглтон - вместо использования

public static Singleton getInstance() {
    if(singleton != null)
        createSingleton();
        return singleton;
    }
}

Вы можете вызвать createSingleton(Information info) непосредственно при запуске приложения (и в setUp-Methods модульных тестов).

0 голосов
/ 19 августа 2009

Возможен ли класс, содержащий только статические методы и поля? Я точно не знаю, какова ваша ситуация, но, возможно, стоит разобраться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...