我只想知道何时应该使用单例类而不是静态对象,反之亦然。因为同一个只能用一个实例。 我可以猜测内存中的存储差异的一个原因。 有没有其他理由选择其中一个。
答案 0 :(得分:1)
只涉及静态初始化,全局常量是可以的。在涉及动态初始化的地方,您要避免使用static initialization fiasco。因此,如果你必须,首选单身人士。
然而,可变单例通常只是变相的全局变量。
因此,在可行的范围内,避免它们。答案 1 :(得分:1)
单例和静态对象之间的主要区别在于单例保证只能有一个特定类类型的实例,而静态对象仅一个特定类的实例类型。这意味着根本区别在于类是否有多个实例是否有意义。例如,假设您有一个构建小部件的工厂。
class WidgetFactory {
public:
int numberOfWidgetsBuiltInTheWholeApplication();
// returns number_of_widgets_built
std::shared_ptr<Widget> build();
// increments number_of_widgets_built
private:
size_t number_of_widgets_built;
};
我们还假设我们要保证我们可以确定在整个应用程序中创建的窗口小部件的数量,并强制只有一个WidgetFactory是一种简单的方法。这是我们使用单身人士的地方。如果我们只是使用静态对象,就像这样:
WidgetFactory& theWidgetFactory()
{
static WidgetFactory widget_factory;
return widget_factory;
}
我们无法保证theWidgetFactory().numberOfWidgetsBuiltInTheWholeApplication()
实际上是真正的总数,因为其他人可以来并制作他们自己的WidgetFactory实例。
但是,如果我们让WidgetFactory成为单身人士,我们现在就有了这个保证。我们可以通过使构造函数私有来做到这一点:
class WidgetFactory {
public:
int numberOfWidgetsBuiltInTheWholeApplication();
std::shared_ptr<Widget> build();
private:
WidgetFactory();
WidgetFactory(const WidgetFactory &); // not implemented
friend WidgetFactory& theWidgetFactory();
};
现在只允许theWidgetFactory()
函数创建实例。还有其他方法可以使numberOfWidgetsBuiltInTheWholeApplication()
在不使用单例的情况下正常运行,但在某些情况下解决方案可能更复杂或有其他缺点。