设计模式_单例模式

0 参考链接

链接_视频
链接_文档

1 介绍

单例模式,Singleton Pattern。

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:需要控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果无则创建。
关键代码:构造函数是私有的。
优点:

  • 在内存中只有一个实例,减少了内存开销,尤其是频繁的创建和销毁实例。
  • 避免对资源的多重占用。(比如写文件操作)

使用场景:

  • 要求生产唯一序列号。
  • 创建的一个对象需要消耗的资源过多,比如I/O与数据库的连接等。
  • 日志类。

Highlight:

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例 ?
  • 指针*存在线程安全问题,以下实现使用引用&的方式。

2 实现

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
class Singletom {
public:
~Singleton() {
std::cout << "Singleton() destruct" << std::endl;
}

// 创建对象的唯一的用户接口
// static修饰符,使其与类无关
// 返回引用&,而不是指针*
static Singleton& CreateObject() {
// 创建static对象
static Singletom obj;
return obj;
}

// Option_A
// 使用delete,禁用拷贝构造
Singleton(Singleton& obj) = delete;

// Option_A
// = 运算符重载
// Singleton* operator= (Singleton& obj) = delete;

private:
// 普通构造函数
// 构造函数私有化
Singleton() {
std::cout << "Singleton() construct" << std::endl;
}

// Option_A
// 同时还要限制其拷贝构造函数
// 拷贝构造函数私有化
// Singleton(Singleton& obj) {
// std::cout << "Singleton(Singleton& obj) construct" << std::endl;
// }

}

int main() {
// 使用引用来接函数返回值
// 因为方法是static,所以使用 类名::函数名 方式调用
// pObj1和pObj2是同一个实例(同一块内存)
Singletom& pObj1 = Singletom::CreateObject();
Singletom& pObj2 = Singletom::CreateObject();

return 0;
}
  • 版权声明: 本博客所有文章均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020-2021 Hang Liu
  • Powered by Hexo Theme Ayer
  • PV: UV: