【设计模式】【单例类】

一,利用模板创建单例类的方法

利用此方法可以创建任意一个类型的实例,每个实例的名字都叫 instance,他们只是类型不同

先直接上代码:

#include <stdio.h>
#include <iostream>
#include <Windows.h>
	using namespace std;

template <typename T>		//声明模板
T *Singleton() {		//for创建单例
	static T instance;	//每个类型的instance都有至于一个,
	//eg, Ctest/Ctest2类的实例全局对象各有一个名字为instance的实例对象
	return &instance;
}

class Ctest	//随便创建一个Ctest类
{
public:
	int m_int;
	char* m_p;
};

class Ctest2	//随便创建一个测试类Ctest2类
{
public:
	int m_int;
	char* m_p;
};

DWORD WINAPI func1(LPVOID lpvoid)
{
	int abc = 0;
	abc++;

	Ctest2* test2_1 = Singleton<Ctest2>();	//test2 地址0x00327138

	Ctest2* test2_2 = Singleton<Ctest2>();	//test2_2 地址0x00327138

	Ctest *test1_2 = Singleton<Ctest>();	//test1_2 地址0x00327164

	return 0;
}

int main()
{
	Ctest *test1 = Singleton<Ctest>();	//test1 地址0x00327164

	Ctest *test1_1 = Singleton<Ctest>();	//test1_1 地址0x00327164

	Ctest2* test2 = Singleton<Ctest2>();	//test2 地址0x00327138


	HANDLE thread_handle = NULL;
	LPDWORD thread_id = 0;

	thread_handle = CreateThread(NULL,0, func1, NULL ,0,thread_id);

	system("pause");
	return 0;
}


 

当类Ctest第一创建Ctest *test1 = Singleton<Ctest>(); /test1 地址0x00327164后,

一个名为instance的Ctest类型的实例全局static对象已经创建。

后面再任何地方用T *Singleton()获取Ctest类型的实例时,都将把名为instance的Ctest类型实例获取到。

所以, test1 test1_1  test1_2  三个其实获得的到的是同一个实例;test2 test2_1  test2_2 三个其实获得的到的是同一个实例;

 
 

二.创建一个单例类,每次都获取到该类的唯一实例

#include <stdio.h>
#include <iostream>
using namespace std;


class Clog
{
public:
	Clog(){
	}
	virtual ~Clog(){}
private:
	static Clog* m_loginstance;
};

Clog* m_loginstance=NULL;

static Clog* getInstanct()
{
	if (NULL == m_loginstance)
	{
		m_loginstance = new Clog;

		return m_loginstance;
	}
	else
	{
		return m_loginstance;
	}


}

void main()
{
	Clog* plog_ =  getInstanct();

	Clog* plog1_ = getInstanct();

	Clog* plog2_ = getInstanct();
	return;
}


每次调用getInstanct方法时候都获取到一个static的Clog实例。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值