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;
}