Singleton模式
Singleton模式的特点:
- 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- 定义一个Instance操作,允许客户访问它的唯一实例。Instance是一个类操作(C++中的一个静态成员函数)。
- 和全局变量相比:
- 编译器不保证全局变量的初始化顺序;
- 全局变量不能防止实例化多个对象。
一、指针实现方式
- //Singleton.h
- class Singleton
- {
- public:
- static Singleton* Instance();
- protected:
- Singleton();
- private:
- static Singleton* _instance;
- };
- //Singleton.cpp
- Singleton* Singleton::_instance = 0;
- Singleton::Singleton()
- {
- cout << "Singleton...." << endl;
- }
- Singleton* Singleton::Instance()
- {
- if (_instance == 0)
- {
- _instance = new Singleton();
- }
- return _instance;
- }
- //main.cpp
- #include "Singleton.h"
- int main()
- {
- Singleton* sgn = Singleton::Instance();
- //sgn->...
- }
//Singleton.h class Singleton { public: static Singleton* Instance(); protected: Singleton(); private: static Singleton* _instance; }; //Singleton.cpp Singleton* Singleton::_instance = 0; Singleton::Singleton() { cout << "Singleton...." << endl; } Singleton* Singleton::Instance() { if (_instance == 0) { _instance = new Singleton(); } return _instance; } //main.cpp #include "Singleton.h" int main() { Singleton* sgn = Singleton::Instance(); //sgn->... }
这是Singleton最常见的一种实现方式。优缺点列举如下:
- 优点
- 对唯一实例的受控访问
- 缩小名空间:对全局变量的一种改进,避免了存储唯一实例的全局变量污染名空间。
- 缺点
- 返回的是指针,调用者有可能会delete掉
- Singleton占用的内存,何时会被释放?
二、引用实现方式
这种方式是《Modern C++ Design》一书中给出的。
- //GameSoundMgr.h
- class GameSoundMgr
- {
- public:
- static GameSoundMgr& GetInstance();
- protected:
- GameSoundMgr();
- GameSoundMgr(const GameSoundMgr&);
- GameSoundMgr& operator=(const GameSoundMgr&);
- ~GameSoundMgr();
- };
- //GameSoundMgr.cpp
- GameSoundMgr& GameSoundMgr::GetInstance()
- {
- static GameSoundMgr tGameSoundMgr;
- return tGameSoundMgr;
- }
//GameSoundMgr.h class GameSoundMgr { public: static GameSoundMgr& GetInstance(); protected: GameSoundMgr(); GameSoundMgr(const GameSoundMgr&); GameSoundMgr& operator=(const GameSoundMgr&); ~GameSoundMgr(); }; //GameSoundMgr.cpp GameSoundMgr& GameSoundMgr::GetInstance() { static GameSoundMgr tGameSoundMgr; return tGameSoundMgr; }
其优缺点列举如下:
- 优点
- 构造/析构函数,拷贝构造函数,赋值函数等,都被限定为私有函数,可防止外部调用生成Singleton的副本
- 外部得到的是static局部变量的引用,不会删除对象
- 程序结束后,Singleton内存自动释放
- 缺点
- 即使不使用此Singleton,静态变量始终存在
三、Singleton Holder
在你的系统中,有可能要用到多个Singleton对象,比如一个国家,主席只能有一个,同样,国防部长也只能有一个,那怎么办呢?《Modern C++ Design》还给我们提供了一种Singleton Holder,通过template的应用,批量生产Singleton。
- //SingletonHolder.h
- template<class MyClass>
- class SingletoHolder
- {
- public:
- static MyClass& GetInstance();
- };
- //SingletonHolder.cpp
- #include "SingletonHolder.h"
- MyClass& SingletonHolder::GetInstance()
- {
- static MyClass tMyClass;
- return tMyClass;
- }
- //class GameSoundSystem;
- typedef SingletonHolder<GameSoundSystem> SingleSoundSytem;
- GameSoundSystem& mySoundSys = SingleSoundSytem ::GetInstance();
//SingletonHolder.h template<class MyClass> class SingletoHolder { public: static MyClass& GetInstance(); }; //SingletonHolder.cpp #include "SingletonHolder.h" MyClass& SingletonHolder::GetInstance() { static MyClass tMyClass; return tMyClass; } //class GameSoundSystem; typedef SingletonHolder<GameSoundSystem> SingleSoundSytem; GameSoundSystem& mySoundSys = SingleSoundSytem ::GetInstance();
以上技术的详情,请参见《Modern C++ Design》一书。另外在我的博客另外一篇文章,也有一个logSingleton的小
posted on 2014-10-24 17:07 strangeman 阅读(250) 评论(0) 编辑 收藏 举报