设计模式——单例模式

单例模式分为两种:一种为懒汉模式(顾名思义就是比较懒,需要的时候采取初始化一个对象),饿汉模式(一开始就全局初始化),其中懒汉模式又分为两种,类内局部静态变量和加锁判空的方式。


方法一:懒汉模式  指针初始化

//Begin 单例懒汉模式  指针初始化/
class Singleton
{
private:
	Singleton(){};
	static Singleton* instance;
	static mutex mt;
	
public:
	static Singleton* getInstance();
};

//静态数据成员需要在类外部进行定义和初始化
Singleton* Singleton::instance = NULL;
mutex Singleton::mt;

Singleton* Singleton::getInstance()
{
	if (instance == NULL)					//两重的加锁判断是为了避免该对象已经完成创建 但获取的时候还总是需要等待锁的低效
	{	
		mt.lock();
		if (instance == NULL)
		{
			instance = new Singleton();
		}
		mt.unlock();
	}
	return instance;
}
//End 单例懒汉模式  指针初始化/

 

方式二、懒汉模式——局部静态数据成员

//Begin 单例懒汉模式  局部静态数据成员//
class Singleton2
{
private:
	Singleton2(){};
public:
	static Singleton2* getInstance();
};

Singleton2* Singleton2::getInstance()
{
	static Singleton2 theInstance;			//和全局静态数据成员一样  只能被初始化一次
	return &theInstance;
}

//End 单例懒汉模式  局部静态数据成员//

方式三、饿汉模式——全局静态对象

//Begin 单例饿汉模式  指针
class Singleton3
{
private:
	Singleton3(){};
	static Singleton3* pinstance;				//定义一个静态的指针
	//static Singleton3 instance;					//定义一个静态的成员  可以使用的基础是因为静态成员变量可以是非完全类型
public:
	static Singleton3* getInstance();
	static Singleton3* getOtherInstance();
};

Singleton3* Singleton3::pinstance = new Singleton3();	//在全局的时候就完成初始化,这里的构造函数能够调用因为在Singleton3的作用域之内
//Singleton3 Singleton3::instance;						//在全局时候完成初始化

Singleton3* Singleton3::getInstance()
{
	return pinstance;
}

Singleton3* Singleton3::getOtherInstance()
{
	return &instance;
}
//End 单例饿汉模式  指针

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值