设计模式C++描述----01.单例(Singleton)模式
来源:互联网 发布:电商跟淘宝有区别吗 编辑:程序博客网 时间:2024/05/22 22:46
一.概念
单例模式:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。
[cpp]
class CSingleton
{
//公有的静态方法,来获取该实例
public:
static CSingleton* GetInstance()
{
if ( m_pInstance == NULL ) //判断是否第一次调用
m_pInstance = new CSingleton();
return m_pInstance;
}
//私有构造函数,防止实例化
private:
CSingleton(){};
//私有静态指针变量,指向类的唯一实例
private:
static CSingleton * m_pInstance; //声明一个静态成员
};
CSingleton* CSingleton::m_pInstance = NULL; //定义并初始化静态数据成员
int main()
{
CSingleton* ps1 = CSingleton::GetInstance();
CSingleton* ps2 = CSingleton::GetInstance();
CSingleton* ps3 = ps1->GetInstance();
CSingleton & ps4 = * CSingleton :: GetInstance();
if (ps1 == ps2)
{
cout<< "ps1 = ps2"<<endl;
}
if (ps1 == ps3)
{
cout<< "ps1 = ps3"<<endl;
}
if (&ps4 == ps1)
{
cout<< "ps1 = ps4"<<endl;
}
return 0;
}
单例模式通过类本身来管理其唯一实例,唯一的实例是类的一个普通对象,但设计这个类时,让它只能创建一个实例并提供对此实例的全局访问。
用户访问唯一实例的方法只有 GetInstance() 成员函数。如果不通过这个函数,任何创建实例的尝试都将失败,因为类的构造函数是私有的。
有一点要注意:一定要加上 CSingleton* CSingleton::m_pInstance = NULL; 这一句,不然的话编译会出错,因为这一句才是变量定义。
二.单例类CSingleton 有以下特征 www.2cto.com
它有一个指向唯一实例的静态指针m_pInstance,并且是私有的;
它有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;
它的构造函数是私有的,这样就不能从别处创建该类的实例。
三.存在的问题
1.m_pInstance 指向的空间什么时候释放呢?
如果在类的析构行为中有必须的操作,比如关闭文件,释放外部资源,那么上面的代码无法实现这个要求。我们需要一种方法,正常的删除该实例。
不合理的解决方法:
在程序结束时调用 GetInstance(),并对返回的指针掉用 delete操作。这样做可以实现功能,但不仅很丑陋,而且容易出错。因为这样的附加代码很容易被忘记,而且也很难保证在delete之后,没有代码再调用 GetInstance 函数。也就是说释放操作由使用者来管理,而不是由类本身来管理,这违背了类的单一职责的原则,这是不合理的。
2. 该实例的析构函数什么时候执行?
上面的类里为什么没有析构函数,其实即便你加上析构函数也是可以的,但是这个析构函数不会被执行的。因为你的实例是 new 出来的,所以只有 delete 时,才会调用析构函数,但是在哪里调用 delete 呢!?这又回到了上面的问题。
一种妥善的方法:
[cpp]
class CSingleton
{
public:
static CSingleton* GetInstance()
{
static CSingleton instance; //静态局部变量
return &instance;
}
private:
CSingleton() {}; //构造函数
};
局部静态对象实例 instance 是第一次调用 GetInstance() 时被构造,一直保持活动状态直到应用程序终止,与动态分配对象不同,静态对象当应用程序终止时被自动销毁掉,所以就不必再手动销毁实例了。
当然这里,可以加上析构函数来处理你想要的操作。
这样做的要点有以下几点:
1. 静态变量在内存中只有一份,从而保证了单例模式中单一实例的要求。
2. 静态变量在程序终止时会被自动销毁,从而保证了空间正常释放。
- 设计模式C++描述----01.单例(Singleton)模式
- 设计模式C++描述----01.单例(Singleton)模式
- 设计模式C++描述----01.单例(Singleton)模式
- 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)
- 单例设计模式(Singleton)
- 单例设计模式Singleton
- singleton(单例设计模式)
- 单例设计模式(Singleton)
- Singleton 单例设计模式
- 单例设计模式Singleton
- Singleton 单例设计模式
- Singleton单例设计模式
- 单例(Singleton)设计模式
- 设计模式-Singleton单例
- 单例(Singleton)设计模式
- c++-单例模式Singleton
- 设计模式(2)-单例模式(Singleton)
- 设计模式 - Singleton Pattern(单例模式)
- HDU 1086
- JavaScript学习笔记(二) 基础
- [ios开发]判断网络连接是否正常
- 遍历用户提供文件夹下的所有文件夹路径
- 金山一员工在办公室猝死 死因正在调查中
- 设计模式C++描述----01.单例(Singleton)模式
- RGB颜色查询对照表
- 用两个栈实现一个队列的功能
- 菜鸟 Bundler 在 Windows 下的安装、配置和使用 方法以及cygwin的安装和卸载方法汇总
- C++:探讨i++和++i
- 全新Windows 8开发者初学包和虚拟实验室发布
- C/C++中*、&用法
- SQL处理语句步骤
- HDU 2160母猪的故事