C++设计模式8——单例(Singleton)模式
1. 单例(Singleton)模式介绍
定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器
特点:
- 单例类只有一个实例对象;
- 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点;
单例模式创建步骤:
类中:
- 构造函数私有化;
- 增加静态私有的当前类的指针变量;
- 提供静态对外接口,可以让用户获得单例对象;
该私有的构造函数的构造时机上来说也可以分两种情况来构造:
-
只有当需要改类的时候去构造(即为懒汉模式)
-
在程序开始之前我就先构造好,你到时候直接用就行(即为饿汉模式)
懒汉式碰到多线程,是线程不安全
饿汉式是线程安全的,多线程用饿汉式
2. 看代码,一目了然
#include <iostream>
using namespace std;
//单例 分为饿汉式/懒汉式
// 懒汉式碰到多线程,是线程不安全
// 饿汉式是线程安全的,多线程用饿汉式
//懒汉式
class Singleton_Lazy {
private:
Singleton_Lazy(){}
public:
static Singleton_Lazy* getInstance(){
if (NULL == pSingleton) {
pSingleton = new Singleton_Lazy;
}
return pSingleton;
}
private:
static Singleton_Lazy* pSingleton;
};
Singleton_Lazy* Singleton_Lazy:: pSingleton = NULL;
//饿汉式
class Singleton_Hungry {
private:
Singleton_Hungry() {}
public:
static Singleton_Hungry* getInstance() {
return pSingleton;
}
private:
static Singleton_Hungry* pSingleton;
};
Singleton_Hungry* Singleton_Hungry::pSingleton = new Singleton_Hungry;
void test(){
Singleton_Lazy* p1 = Singleton_Lazy::getInstance();
Singleton_Lazy* p2 = Singleton_Lazy::getInstance();
if (p1 == p2){
cout << "两个指针指向同一块内存空间,是单例" << endl;
}
else {
cout << "不是单例模式" << endl;
}
Singleton_Hungry* p3 = Singleton_Hungry::getInstance();
Singleton_Hungry* p4 = Singleton_Hungry::getInstance();
if (p3 == p4){
cout << "两个指针指向同一块内存空间,是单例" << endl;
}
else {
cout << "不是单例模式" << endl;
}
}
int main(){
test();
return 0;
}