C++单例模式

在开发过程中,经常会用到单例,简单梳理一下几种单例的写法。

写法One

最开始,我写单例大概是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
class SingletonA {
public:
static SingletonA& Instance() {
if (!instance) {
instance = new SingletonA;
}
return *instance;
}
private:
SingletonA() { }
static SingletonA* instance;
};

貌似线程不安全这样写。

写法Two

之后,好像是这样写的:

1
2
3
4
5
6
7
8
9
class SingletonB {
public:
static SingletonB& Instance() {
static SingletonB* instance = new SingletonB;
return *instance;
}
private:
SingletonB() { }
};

写法Three

现在,就是这样写:

1
2
3
4
5
6
7
8
template<class T>
class SingletonC {
public:
static T& Instance() {
static T* instance = new T;
return *instance;
}
};

总结

第三种写法利用了模板,看上去会灵活很多,特别是需要多个单例实例的时候,不用重复写部分代码。

通常封装的时候,为了提高可读性,可以这样写:

1
2
class Type {};
using SingletonType = SingletonC<Type>;

在定义一些全局常量时,还可以将返回的实例定义为常引用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ConstValues {
public:
const std::string A = "A";
const std::string B = "B";
};

template<class T>
class SingletonC {
public:
static const T& Instance() {
static T* instance = new T;
return *instance;
}
};

using SingletonConstValues = SingletonC<ConstValues>;