【设计】单例模式--C++源代码(VS2015)

来源:互联网 发布:机器人软件编程 编辑:程序博客网 时间:2024/05/29 19:26
#include <iostream>
#include <Windows.h>
using namespace std;
CRITICAL_SECTION cs;

/*
单例模式
让类自身负责保存它唯一实例。
这个类保证没有其他实例被创建,并提供一个访问该实例的方法
*/
class Singleton
{
private :
int m;
Singleton() {}
Singleton(const Singleton&) {}
Singleton& operator=(const Singleton&) {}
static Singleton* instance;
public :
static Singleton* GetInstance();
void SetVal(int num)
{
m = num;
}
int GetVal()
{
return m;
}
};

/*
单例模式--饿汉
单例类定义的时候就进行实例化(static)
空间换时间
*/
/*
Singleton* Singleton::instance = new Singleton();
Singleton* Singleton::GetInstance()
{
return instance;
}
*/

/*
单例模式--懒汉
单例类使用的时候就进行实例化
时间换空间
*/
Singleton* Singleton::instance = NULL;
Singleton* Singleton::GetInstance()
{
/*
Double-CheckLocking
*/
if (NULL == instance)
{
EnterCriticalSection(&cs);
if (NULL == instance)
{
instance =  new Singleton();
}
LeaveCriticalSection(&cs);
}
return instance;
}

int main()
{
InitializeCriticalSection(&cs);
Singleton* s1 = Singleton::GetInstance();
Singleton* s2 = Singleton::GetInstance();
printf("&s1 = %p\t&s2 = %p\n", s1, s2);
s1->SetVal(10);
s2->SetVal(20);
printf("&s1->GetVal() = %d\t&s2->GetVal() = %d\n", s1->GetVal(), s2->GetVal());
if (s1 == s2)
{
cout << "instance1==instance2" << endl;
}
else
{
cout << "instance1!=instance2" << endl;
}
system("pause");
return 0;
}
原创粉丝点击