如何用C++写一个Singleton 单例模式
2015-11-01 00:45
381 查看
单例模式是比较常用的设计模式,尤其是在游戏设计中会经常用到,在面试中也是非常容易被问到和实现。今天我们来看看如何用C++来实现一个singleton。
单例模式的主要特性是只能实例化一个对象,在游戏中我们会有各种资源,我们也会在各个地方需要访问这些资源,那么如何得到这些资源呢?我们可以写一个资源管理类来获得各种你想要的资源,问题是在不同的类中如果你想获取游戏资源,就要新建一个资源管理类,这样其实是对内存的浪费。我们其实只需要一个资源管理类就够了,那么这时候就可以使用singleton。
既然只能实例化一个对象,那么就不能让用户直接用new来实例化对象的,因为这样用户将可以实例化很多个对象。我们知道在实例化对象的时候会调用构造函数,为了禁止用户在外部实例化对象,我们可以将构造函数私有化。同样,我们也不应该允许用户copy一个实例,我们可以通过将copy构造函数和赋值函数私有化来禁止copy操作。既然无法在类外实例化对象,用户要如何获得一个对象呢?我们可以提供一个接口,用户需要一个此类对象的时候可以通过这个接口获得。嗯,一个简单的singleton必须包含的内容就这些啦,我们来看看代码怎么实现:
在使用的时候我们需要在外部对静态实例初始化:
程序结束时删除此对象:
一个基本的singleton大概这样就可以了,在这里我没有考虑线程安全,只提供一个基本写法。
单例模式的主要特性是只能实例化一个对象,在游戏中我们会有各种资源,我们也会在各个地方需要访问这些资源,那么如何得到这些资源呢?我们可以写一个资源管理类来获得各种你想要的资源,问题是在不同的类中如果你想获取游戏资源,就要新建一个资源管理类,这样其实是对内存的浪费。我们其实只需要一个资源管理类就够了,那么这时候就可以使用singleton。
既然只能实例化一个对象,那么就不能让用户直接用new来实例化对象的,因为这样用户将可以实例化很多个对象。我们知道在实例化对象的时候会调用构造函数,为了禁止用户在外部实例化对象,我们可以将构造函数私有化。同样,我们也不应该允许用户copy一个实例,我们可以通过将copy构造函数和赋值函数私有化来禁止copy操作。既然无法在类外实例化对象,用户要如何获得一个对象呢?我们可以提供一个接口,用户需要一个此类对象的时候可以通过这个接口获得。嗯,一个简单的singleton必须包含的内容就这些啦,我们来看看代码怎么实现:
class GameData { public: static GameData* getInstance() { if(instance == NULL) instance = new GameData(); return instance; } private: static GameData* instance; GameData(); GameData(const GameData& data); GameData& operator=(const GameData& data); };
在使用的时候我们需要在外部对静态实例初始化:
GameData* GameData::instance = NULL;
程序结束时删除此对象:
delete GameData::getInstance();
一个基本的singleton大概这样就可以了,在这里我没有考虑线程安全,只提供一个基本写法。
相关文章推荐
- c++11特性之override和final关键字
- c++11特性之override和final关键字
- C++之旅<友元函数的注意事项>
- c++数据生成器
- windows下获取mac地址的两种方法
- [LeetCode] Minimum Depth of Binary Tree
- 关于C语言多文件编写的一点小小总结
- Effective C++笔记(三)
- 高质量程序设计指南C++/c语言 第三章
- Leap Motion C++环境的配置
- VC++中文件类型小结
- Android NDK中C++运行时库介绍
- C语言中断言ASSERT
- C++ 异常处理
- C++二分插入排序
- Windows实用系统工具类--C++
- 【LeetCode从零单刷】Combinations & Combination Sum 系列
- c++11 其他特性(一)
- 高质量程序设计指南C++/c语言 第二章
- C++ const 和指针类型