0%

单例模式

目的: 保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享

用途: 系统的日至输出、GUI应用单鼠标、操作系统只能有一个窗口管理器、一台PC连一个键盘、避免两个打印作业同时输出到打印机中等

单例模式通过类本身管理其唯一实例

唯一实例是类的一个普通对象,设计类时,让它只能创建一个实例并提供对此实例的全局访问。

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

class CSingleton{
private:
CSingleton(){} //构造函数私有
static CSingleton* m_pInstance;
public:
static CSingleton* GetInstance(){
if(m_pInstance == NULL)//判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
}

CSingleton* CSingleton::m_pInstance = NULL;

int main(){
CSingleton* s1 = CSingleton::GetInstance();
CSingleton* s2 = CSingleton::GetInstance();
if(s1 == s2){
cout <<"s1 = s2"<< endl;
}
return 0;
}

//执行结果: s1 = s2

用户访问唯一实例的方法只有 GetInstance() 成员函数。若不通过,因构造函数私有,故创建实例的尝试都将失败。

GetInstance()的返回值是这个函数首次被访问时被创建的,所有GetInstance()之后的调用都返回相同实例的指针。

单例类 CSingleton 有以下特征:

  • 有一个指向唯一实例的静态指针 m_pInstance ,并且是私有的
  • 有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例
  • 其构造函数私有,这样就不能从别处创建该类的实例