2012-05-10 4 views
0

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

  • В первом вызове необходимо передать «название модели» (программные нагрузки и работает имитационные модели) и на основе имени, программа будет загружать настройки выбранной модели.

    Настройки :: деЫпзЬапсе («стр.1»)

  • В последующих вызовах, не желательно (или иногда это возможно), чтобы передать «название модели» снова. Таким образом, это будет идеально, если мы можем позвонить без имени модели.

Что мне делать в этом случае? Есть 2 метода getInstance? Или установите «имя модели» в статическую переменную в классе «Настройки» перед первым вызовом getInstance? Или что?

+4

Использование Singleton -> отсутствие сочувствия. – Puppy

+0

Возможно, просто не используйте синглтон? – ybungalobill

ответ

2

Имея 2 getInstance() методы звучат как рецепт катастрофы :) Я бы предположил, что пользователи этого класса всегда будут спрашивать: «Ну, какой из них я использую?» Что произойдет, если кто-то сначала назовет неправильную версию?

Вместо использования методов 2 getInstance(), я думаю, что было бы лучше использовать статический переменный подход и установить его на ранней стадии инициализации. Но это также подвержено ошибкам.

Еще лучше было бы рассмотреть какую-то фабрику, которая берет имя модели при создании экземпляра и внутренне изолируется. Завод может быть что-то вроде этого:

class SettingsFactory 
{ 
public: 
    SettingsFactory(const std::string &modelName); 
    Settings *getUniqueSettingsInstance(); 

private: 
    SettingsFactory(); // cant instantiate the default ctor 

    // put the singleton stuff here 
}; 
+0

Метод фабрики звучит как правильное решение для меня. –

+0

@SteveTownsend, Я согласен, я немного изменил ответ. – Brady

+0

Мне также нравится фабричный подход. Позвольте мне подумать и посмотреть, как я должен ее чистить. – wmac

0

Если я вас правильно понимаю, почему ты просто не перегрузить метод GetInstance() со значением по умолчанию NULL? Когда вы вызываете свой getInstance во второй раз, не имеет значения, является ли имя модели NULL char*, потому что на этот раз вам не нужно его строить.

class Settings 
{ 
    // .. 
    static Settings * getInstance(char * modelName = NULL); 
} 
+0

Хорошая идея, но что произойдет, если она уже была создана, а кто-то прошел в modelName? Они ожидали, что что-то случится, но, скорее всего, это не будет. – Brady

+0

@Brady - У меня возникнет соблазн включить в этот сценарий утверждение, я на самом деле полагаю, что OP не должен использовать синглтон вообще, но я думаю, что это будет работать в целом. – Benj

+0

@Benj - альтернативный метод доступа к настройкам из разных частей большой программы (и каждый раз избегайте считывания файлов настроек, так как я обращаюсь к настройкам миллионов раз в секунду в разных частях программного обеспечения). – wmac

2

Я не говорю, что одинокие люди злы, но здесь вы действительно не должны их использовать. Общее правило: если ваш класс имеет какое-то состояние, которое каким-либо образом воспринимается снаружи, оно не должно быть ничем. Глобального государства следует избегать по широко известным причинам.

Ваш класс явно имеет состояние, потому что он требует некоторой инициализации. Не делайте это синглом. Найдите другой способ структурирования кода.

+0

+1 и я скажу: синглтоны злы. Ну, обычно ... –

Смежные вопросы