现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

设计模式(1)单例模式–Singleton

2012-07-17 21:49 工业·编程 ⁄ 共 1333字 ⁄ 字号 暂无评论

    Singleton模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。比如读取并保存配置文件的类就只应该有一个实例。Singleton模式比较简单,也很容易理解。所以不做太多解释,上源码,两种方式的实现代码:

//Singleton.h
#ifndef _SINGLETON_H_
#define _SINGLETON_H_

// 单例模式实现方法1
class Singleton
{
public:
static Singleton* GetInstance();

protected:

private:
Singleton();

static Singleton* _instance;

// CDestory唯一的工作就是在析构函数中删除Singleton的实例
class CDestory
{
public:
~CDestory()
{
delete Singleton::GetInstance();
};
};
static CDestory destory; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数
};

// 单例模式实现方法2
// 此方法比较简洁,并且不用关心单例指针的释放问题
class SingletonEx
{
public:
static SingletonEx* GetInstance()
{
static SingletonEx _instance;
return &_instance;
}

private:
SingletonEx& operator=(const SingletonEx& other);

SingletonEx()
{
};
SingletonEx(const SingletonEx&);

};
#endif //~_SINGLETON_H_

//Singleton.cpp
#include "Singleton.h"
#include <iostream>
using namespace std;
Singleton* Singleton::_instance = 0;

Singleton::Singleton()
{
cout<<"Singleton...."<<endl;
}

Singleton* Singleton::GetInstance()
{
if (_instance == 0)
{
_instance = new Singleton();
}
return _instance;
}

//main.cpp
#include "Singleton.h"
#include <iostream>
using namespace std;
#include <crtdbg.h>

int main(int argc,char* argv[])
{
Singleton* sgn = Singleton::GetInstance();
Singleton* sgn1 = Singleton::GetInstance();
_ASSERT(sgn==sgn1); // 证明两个指针地址相同,是同一个对象的地址

SingletonEx* sgnex = SingletonEx::GetInstance();
SingletonEx* sgnex1 = SingletonEx::GetInstance();
_ASSERT(sgnex==sgnex1); // 证明两个指针地址相同,是同一个对象的地址

return 0;
}

给我留言

留言无头像?