一、单例模式中的角色和职责
Singleton(单例):在单例类的内部实现只生成一个实例,同时它提供一个静态的 getInstance()工厂方法,让客户可以访问它的唯一实例;为了防止在外部对其实例化,将其构造函数设计为私有;在单例类内部定义了一个 Singleton类型的静态对象,作为外部共享的唯一实例
如何构建单例:
一是单例模式的类只提供私有的构造函数
二是类定义中含有一个该类的静态私有对象
三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象
二、适用场景
1、系统只需要一个实例对象,如系统要求提供一个唯一的序列号生成器或资源
管理器,或者需要考虑资源消耗太大而只允许创建一个对象
2、 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不
能通过其他途径访问该实例
三、示例代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//实现单例步骤
//1. 构造函数私有化
//2. 增加静态私有的当前类的指针变量
//3. 提供静态对外接口,可以让用户获得单例对象
//懒汉式
class Singleton_Lazy{
private:
Singleton_Lazy(){}
public:
static Singleton_Lazy* getInstance(){
if (pSingleton == NULL){
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(void)
{
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(void){
test();
return 0;
}
PS:懒汉模式不是线程安全的,饿汉模式是线程安全的