设计模式:单例

单例设计模式的设计思想:
在一些情形下,保持类的实例只有一个非常重要。例如:一个表示文件系统的Class。一个操作系统一定是只有一个文件系统的,因此,我们希望表示文件系统的类实例有且仅有一个。单例模式 是设计模式中一种实现这一类需求的设计方法。

该代码线程不安全。
线程安全的两个操作:

  • 对象在类外创建。
  • 加锁。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>

using namespace std;


class Singleton {
public:
static Singleton *GetInstance() {
if (m_pInstance == nullptr) {
m_pInstance = new Singleton();
}
return m_pInstance;
}

int getCount() const;

void printTest(const string &test) {
count++;
cout << test << endl;

}

// 实现一个内嵌垃圾回收类
class CGarbo {
public:
~CGarbo() {
cout << "销毁" << endl;
delete Singleton::m_pInstance;
}
};

~Singleton(){

cout << "1123123" << endl;
//delete m_pInstance;
}

private:
void setCount(int count);

int count;

// 默认构造函数私有化,防止创建多个对象。
Singleton() : count(0) {
setCount(0);
};

// 拷贝构造函数私有化,防止在堆区创建对象。
Singleton(Singleton const &) : count() {};


static Singleton *m_pInstance;
};

Singleton *Singleton::m_pInstance = nullptr;

int Singleton::getCount() const {
return count;
}

void Singleton::setCount(int count) {
Singleton::count = count;
}

Singleton::CGarbo Garbo;


static void test01() {

Singleton *s1 = Singleton::GetInstance();

s1->printTest("1");
s1->printTest("2");
s1->printTest("3");

cout << "s1:count" << s1->getCount() << endl;

Singleton *s2 = Singleton::GetInstance();

s2->printTest("4");
s2->printTest("5");
s2->printTest("6");
cout << "s2:count" << s2->getCount() << endl;

}

int main(int argc, char *argv[]) {


test01();

return 0;
}