C++ 设计模式之一

单例模式

单例模式的介绍

Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的 getInstance() 工厂方法,让客户可以直接访问它的唯一实例。为了防止在外部对其实例化,需要将其默认构造函数和拷贝构造函数设计为私有化。在单例类内部定义了一个 Singleton 类型的静态对象,作为外部共享的唯一实例。

单例模式的使用

单例模式使用案例一

提示

在 C++ 中使用单例模式时,一般不用管单例对象的内存释放问题,也就是不需要编写自定义的析构函数。

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
using namespace std;

class ChairMan {

private:
// 私有的默认构造函数
ChairMan() {
cout << "创建主席" << endl;
}

// 私有的拷贝造函数
ChairMan(const ChairMan &c) {

}

public:
// 获取单例
static ChairMan *getInstance() {
return singleton;
}

private:
// 声明静态变量(单例)
static ChairMan *singleton;

};

// 初始化静态变量(单例),分配内存空间
ChairMan *ChairMan::singleton = new ChairMan();

void test01() {
ChairMan *man1 = ChairMan::getInstance();
ChairMan *man2 = ChairMan::getInstance();
// 判断内存地址是否相同
cout << (man1 == man2 ? "true" : "false") << endl;
}

int main() {
cout << "---- main ----" << endl;
test01();
return 0;
}

程序运行的输出结果如下:

1
2
3
创建主席
---- main ----
true

单例模式使用案例二

这里将使用单例模式,模拟公司员工使用打印机的场景,打印机可以打印员工要输出的内容,并且可以累积打印机的使用次数。

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
#include <iostream>
#include <string>

using namespace std;

class Printer {

private:

// 私有的默认构造函数
Printer() {

}

// 私有的拷贝造函数
Printer(const Printer &p) {

}

public:
void printText(string str) {
cout << str << endl;
times++;
}

long getTimes() {
return times;
}

public:
static Printer *getInstance() {
return singleton;
}

private:
// 打印次数
long times = 0;

// 声明静态变量(单例)
static Printer *singleton;
};

// 初始化静态变量(单例),分配内存空间
Printer *Printer::singleton = new Printer();

int main() {
Printer *printer1 = Printer::getInstance();
Printer *printer2 = Printer::getInstance();
// 判断内存地址是否相同
cout << (printer1 == printer2 ? "true" : "false") << endl;

printer1->printText("C++ Guilde");
printer1->printText("Think in Java");
long times = printer1->getTimes();
cout << "times = " << times << endl;

return 0;
}

程序运行的输出结果如下:

1
2
3
4
true
C++ Guilde
Think in Java
times = 2