在项目中使用单例类是个比较通用的需求,比如我们定义了一个类A,我们想实现一个类A的单例模式。
方法1:直接在类A的定义中实现
class A {
public:
static A& Get()
{
static A instance;
return instnace;
}
private: // 将A的构造函数声明为private,这样就避免在外部产生A对象实例的可能性。
A() {}
~A() {}
};
// 调用A单例对象成员函数
A::Get().xxx; // 单例实例对象
方法2:通过一个模板类
template<typename T>
class Singleton {
public:
static T& Get()
{
static T instance;
return instance;
}
};
// 调用A单例对象成员函数
Singleton<A>::Get().xxxx;
总结:方法2的好处是可以用类模板进行泛化,如果你的项目场景中会涉及多个类的单例需求,可以使用该方法,但是这里有个问题是它没办法阻止用户自己创建T类型对象。