文章目录
- 饿汉式
- 懒汉式
- 单例模式(Singleton Pattern,也称为单件模式),使用最广泛的设计模式之一。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享
- 面向对象编程中,每个对象都应该抽象代表一个设备,并通过对象完成对某个具体设备的管理和维护
- 对于有些类只能有一个实例很重要,例如打印机管理器、设备管理器、任务管理器等
- 实现单例模式的三个主要步骤:
- 私有化构造函数
- 使用静态成员变量维护唯一的单例对象
- 定义静态成员函数用于获取单例对象
- 私有化构造函数
classSingleton{private:Singleton(void){...}Singleton(constSignleton&that){}...};- 使用静态成员变量维护唯一的单例对象
classSingleton{private:Singleton(void){...}Singleton(constSignleton&that){}...staticSingleton s_instance;};Singleton Singleton::s_instance;- 定义静态成员函数用于获取单例对象
classSingleton{private:Singleton(void){...}Singleton(constSignleton&that){}...staticSingleton s_instance;public:staticSingleton&getInstance(void){returns_instance;}};Singleton Singleton::s_instance;饿汉式
- 加载进程时即完成创建(饿), 用不用都创建
#include<iostream>usingnamespacestd;classSignleton{private:intm_i;Signleton(inti=0){m_i=i;}Signleton(constSignleton&that){}staticSignleton m_instance;public:staticSignleton&getInstance(){returnm_instance;}voidprint(){cout<<m_i<<endl;}};Signleton Signleton::m_instance=111;intmain(void){Signleton&s1=Signleton::getInstance();Signleton&s2=Signleton::getInstance();Signleton&s3=Signleton::getInstance();//Signleton s4 = 12; //errorcout<<&s1<<endl;cout<<&s2<<endl;s1.print();s2.print();return0;}懒汉式
- 用时再创建(懒),不用再销毁
#include<iostream>usingnamespacestd;classSignleton{private:intm_i;staticintm_count;//记录对象的引用次数staticSignleton*m_instance;Signleton(inti=0){m_i=i;cout<<"constructor "<<endl;}Signleton(constSignleton&that){}public:staticSignleton&getInstance(void){if(m_instance==NULL){m_instance=newSignleton(123);}m_count++;return*m_instance;}voidrelease(){m_count--;if(m_count==0){deletem_instance;m_instance=NULL;}}~Signleton(){}};Signleton*Signleton::m_instance=NULL;intSignleton::m_count=0;intmain(void){//Signleton s1; //errorSignleton&s1=Signleton::getInstance();Signleton&s2=Signleton::getInstance();Signleton&s3=Signleton::getInstance();cout<<&s1<<" "<<&s2<<" "<<&s3<<endl;// 三个引用地址相同s1.release();s2.release();s3.release();return0;}