一、 单例(Singleton)模式
单例模式的特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其它对象提供这一实例。
//文件 Singleton.h
#include "stdafx.h"
#ifndef _DEF_SINGLETON_H_
#define _DEF_SINGLETON_H_
/*
1,单例类: 只能有一个实例
2,构造函数为protected或者private可以避免CSingleton loSington1; 这样的对象创建出现。
3,统一的对象创建接口Instance()。 所有的外部都通过这个函数获得CSingleton的指针。
4,
*/
class CSingleton
{
public:
static CSingleton* Instance();
protected:
CSingleton();
private:
static CSingleton* m_pSingleton;
};
#endif
///
/
// 文件 Singleton.cpp
#include "stdafx.h"
#include "Singleton.h"
CSingleton* CSingleton::m_pSingleton = NULL;
CSingleton::CSingleton()
{
}
CSingleton* CSingleton::Instance()
{
//不考虑线程的安全性,可保持只创建一个对象
if (NULL == m_pSingleton)
{
m_pSingleton = new CSingleton;
}
return m_pSingleton;
}
//
///
//文件 main.cpp 验证
#include "stdafx.h"
#include "Singleton.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
CSingleton* lpSingleton1 = NULL;
CSingleton* lpSingleton2 = NULL;
//验证1 报错 cannot access protected member declared in class 'CSingleton
//CSingleton loSingleton;
//lpSingleton1 = new CSingleton;
//验证2 多次获得的是同一个CSingleton
lpSingleton1 = CSingleton::Instance();
lpSingleton2= CSingleton::Instance();
std::cout<<"lpSingleton1的地址 "<<lpSingleton1<<"lpSingleton2的地址 "<<lpSingleton2<<std::endl;
return 0;
}