单例模式

简介

单例模式:

保证一个类有且只有一个实例,并提供一个访问它的全局访问点。

常用的场景

单例模式常常与工厂模式结合使用,因为工厂只需要创建产品实例就可以了,在多线程的环境下也不会造成任何的冲突,因此只需要一个工厂实例就可以了。

优点:

1.减少了时间和空间的开销(new实例的开销)。

2.提高了封装性,使得外部不易改动实例。

缺点:

1.懒汉式是以时间换空间的方式。

2.饿汉式是以空间换时间的方式。

注意点:

单例模式根据是否是线程安全分为两种:

懒汉式:在类中定义static对象,在instance时判断是否new多线程时无法保证pData == NULL)只生成一个对象,线程不安全。

饿汉式:在全局初始化类对象。

测试代码

 

#include <iostream>
#include <assert.h>
#include <vector>
using namespace std;
#include <string>

#include <list>

//线程锁
class Lock
{

};

//懒汉线程不安全
class FLHanSinglen
{
private:
	FLHanSinglen(){m_pInstance = NULL;};
	~FLHanSinglen(){};

	static FLHanSinglen* m_pInstance ;

public:

	FLHanSinglen* getInstance()
	{
		if( m_pInstance == NULL )
		{
			m_pInstance = new FLHanSinglen();
		}
		return m_pInstance;
	}
};


//懒汉线程安全
class FLAHanSinglen
{
private:
	FLAHanSinglen(){m_pInstance = NULL;};
	~FLAHanSinglen(){};

	static FLAHanSinglen* m_pInstance ;

public:

	static FLAHanSinglen* getInstance()
	{
		if(m_pInstance == NULL)
		{
			Lock lock;
			if( m_pInstance == NULL )
			{
				m_pInstance = new FLAHanSinglen();
			}
		}
		return m_pInstance;
	}
};

//饿汉模式  都是线程安全 无内存泄露
class FEHanSinglen
{
private:
	FEHanSinglen(){};
	~FEHanSinglen()
	{
		if(m_pInstance != 0)
		{
			delete m_pInstance;
		}
		m_pInstance = 0;
	};

	static FEHanSinglen* m_pInstance;

public:
	static FEHanSinglen* getInstance()
	{
		return m_pInstance;
	}
};
 FEHanSinglen* FEHanSinglen::m_pInstance = new FEHanSinglen();



void main()
{
	
	FEHanSinglen::getInstance();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值