我有一个用于软件设置的单例类。在大型软件的不同位置,可以使用getInstance并使用它来访问已从文件中读入设置类的设置。但是:
在初始调用中,必须传递“模型名称”(软件加载并运行模拟模型),并根据名称,软件将加载所选模型的设置。
设置::的getInstance( “号楼”)
在以后的调用中,不希望(或有时可能)再次传递“模型名称”。因此,如果我们可以在没有型号名称的情况下打电话,那将是理想的。
在这种情况下我该怎么办?有2个getInstance方法吗?或者在第一次调用getInstance之前将“模型名称”设置为Settings类中的静态变量?或者是什么?
答案 0 :(得分: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
};
答案 1 :(得分:2)
我不是一个说单身人士是邪恶的人,但在这里你真的不应该使用它们。一般的经验法则:如果你的班级有一些从外面可以察觉的状态,那么它不应该是一个单身人士。出于众所周知的原因,应该避免全球状态。
你的班级显然有状态,因为它需要一些初始化。不要把它变成单身人士。找到构建代码的其他方法。
答案 2 :(得分:0)
如果我理解正确,为什么不直接使用默认值NULL
重载getInstance()方法?第二次调用getInstance时,模型名称是NULL char*
是否无关紧要,因为这次不需要它来构造对象。
class Settings
{
// ..
static Settings * getInstance(char * modelName = NULL);
}