一,利用模板创建单例类的方法
利用此方法可以创建任意一个类型的实例,每个实例的名字都叫 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;
}