C++两种编写单件模式方法对比
1.第一种:
1 template <typename T>
2 class CSingletonT
3 {
4 public:
5
6 virtual ~CSingletonT(){}
7
8 protected:
9
10 CSingletonT(){}
11
12 public:
13
14 static T &Instance()
15 {
16 static T instance;
17 return instance;
18 }
19 };
2 class CSingletonT
3 {
4 public:
5
6 virtual ~CSingletonT(){}
7
8 protected:
9
10 CSingletonT(){}
11
12 public:
13
14 static T &Instance()
15 {
16 static T instance;
17 return instance;
18 }
19 };
2.第二种:
1 class CSingletonObject
2 {
3 public:
4
5 static T &Instance()
6 {
7 return s_object;
8 }
9
10 virtual ~CSingletonObject(){}
11
12 protected:
13
14 CSingletonObject(){}
15
16 private:
17
18 static CSingletonObject s_object;
19 }
20
21 CSingletonObject CSingletonObject::s_object;
2 {
3 public:
4
5 static T &Instance()
6 {
7 return s_object;
8 }
9
10 virtual ~CSingletonObject(){}
11
12 protected:
13
14 CSingletonObject(){}
15
16 private:
17
18 static CSingletonObject s_object;
19 }
20
21 CSingletonObject CSingletonObject::s_object;
3.两种编写方式其实对程序有着比较重要的影响,第一种是在调用该类的Instance方法后,对象才被创建出来,而第二种,是程序启动后,就直接创建出来。
4.第一种单件模式在多线程(之前没有被任何单线程调用过)调用的时候,会发生内存错误问题,原因在因都在调用Instance方法时,第一次调用会创建内存,而有可能在对象没有完全创建完成时,第二次调用Instance方法已经开始并且到了 return instance; 的步骤,所以在使用对象方法数据成员时就会出现内存异常。
5.第一种单件编写方案比较合适需要初始化的对象(容易编写,继承一个类即可);第二种单件编写方案使用性更广,无过多限制(只能手动编写,无捷径)。
浙公网安备 33010602011771号