0

我有一个用于软件设置的单例类。在大型软件的不同位置,可以获取实例并使用它来访问已经从文件中读入设置类的设置。然而:

  • 在初始调用中,需要传递“模型名称”(软件加载并运行仿真模型),根据名称,软件将加载所选模型的设置。

    设置::getInstance("building1")

  • 在以后的调用中,不希望(或有时可能)再次传递“模型名称”。因此,如果我们可以在没有模型名称的情况下调用将是理想的。

在这种情况下我应该怎么做?有 2 个 getInstance 方法吗?或者在第一次调用 getInstance 之前将“模型名称”设置为 Settings 类中的静态变量?或者是什么?

4

3 回答 3

2

我不是说单例是邪恶的,但在这里你真的不应该使用它们。一般的经验法则:如果你的类有某种可以从外部感知到的状态,那么它不应该是单例。出于众所周知的原因,应该避免使用全局状态。

你的类显然有状态,因为它需要一些初始化。不要让它成为单例。寻找其他方式来构建您的代码。

于 2012-05-10T14:11:42.940 回答
2

拥有 2getInstance()种方法听起来像是灾难的秘诀 :) 我想该类的用户总是会问:“我该使用哪一个?” 如果有人先调用了错误的版本会发生什么?

getInstance()我认为与其使用 2种方法,不如使用静态变量的方法,并在初始化阶段的早期进行设置。但这也容易出错。

更好的是考虑某种工厂,它在实例化时采用模型名称并在内部有一个单例。工厂可能是这样的:

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

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

    // put the singleton stuff here
};
于 2012-05-10T14:05:54.310 回答
0

如果我理解正确,为什么不使用默认值重载 getInstance() 方法NULL?当您第二次调用 getInstance 时,模型名称是否为 a 无关紧要,NULL char*因为这次您不需要它来构造对象。

class Settings
{
   // ..
   static Settings * getInstance(char * modelName = NULL);
}
于 2012-05-10T14:06:10.073 回答