设计一个类,我们只能生成该类的一个实例。
单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。(1)这种方法只适用单线程。#include<iostream>#include<stdlib.h>usingnamespacestd;classCsingleton{private:Csingleton()//构造函数私有化{cout<<"Csingleton()"<<endl;}staticCsingleton*m_pInstance;public:staticCsingleton*GetInstance(){//判断是否是第一次调用if(m_pInstance==NULL){m_pInstance=newCsingleton();}returnm_pInstance;}};Csingleton*Csingleton::m_pInstance=NULL;voidtest(){Csingleton*c=Csingleton::GetInstance();Csingleton*s=Csingleton::GetInstance();}intmain(){test();system("pause");return0;}
(2)多线程,当Csingleton还没有创建出来时,需要加把锁;当Csingleton创建出来之后,无需加锁。
#include<iostream>#include<stdlib.h>usingnamespacestd;classCsingleton{private:Csingleton()//构造函数私有化{cout<<"Csingleton()"<<endl;}staticCsingleton*m_pInstance;public:staticCsingleton*GetInstance(){//判断是否是第一次调用if(m_pInstance==NULL){/*lock(syncObj);*/m_pInstance=newCsingleton();}returnm_pInstance;}};Csingleton*Csingleton::m_pInstance=NULL;voidtest(){Csingleton*c=Csingleton::GetInstance();Csingleton*s=Csingleton::GetInstance();}intmain(){test();system("pause");return0;}
(3)利用静态构造函数,初始化静态变量的时候创建实例。
#include<iostream>#include<stdlib.h>usingnamespacestd;classCsingleton{private:Csingleton()//构造函数私有化{cout<<"Csingleton()"<<endl;}private:staticCsingleton*m_pInstance=newCsingleton();public:staticCsingleton*GetInstance(){returnm_pInstance;}};voidtest(){Csingleton*c=Csingleton::GetInstance();Csingleton*s=Csingleton::GetInstance();}intmain(){test();system("pause");return0;}
结果:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。