1、何为单例模式?
单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点(static)。可能有人会想这和全局变量有什么区别呢? 通常我们可以让一个全局成员变量使得一个对象被访问,但它不能仿真被多次对象实例化。一个最好的办法是,让类自身负责保存它的唯一实例。这个类要保证没有其他实例可以被创建,并且它可以提供一个访问该实例的公共接口。
在《大话设计模式》一书中,作者将单例模式比作计划生育,一个类只能实例化为一个对象,再形象不过了(P213)。
下面给出了一段C++编写的Singleton类模板,详情出自http://shinh.skr.jp/template/singleton.html。
/* * File : TemplateSingleton.h * Author: lqh */ #ifndef TEMPLATE_SINGLETON_H_ #define TEMPLATE_SINGLETON_H_ #include <cassert> template<class _T> class Singleton { public: static _T* instance(); //supply the global access point Singleton(); //prevent multiple instances virtual ~Singleton(); protected: static Singleton* _instance; }; template<class _T> _T* Singleton<_T>::instance() { if (_instance == 0) { _instance = new _T; } return dynamic_cast<_T*>(_instance); } template<class _T> Singleton<_T>* Singleton<_T>::_instance = 0; template<class _T> Singleton<_T>::Singleton() { assert(_instance == 0); _instance = this; } template<class _T> Singleton<_T>::~Singleton() { } #endif /* TEMPLATE_SINGLETON_H_ */
该单例模板类的使用方法如下所示:
/* * File : singletonTest.cpp * Author: lqh */ Class ConcreteSingleton : Public Singleton<ConcreteSingleton> {}; int main() { ConcreteSingleton *cs1 = ConcreteSingleton::instance(); ConcreteSingleton *cs2 = ConcreteSingleton::instance(); assert(cs1 != 0); assert(cs1 == cs2); }
2、LTE系统级仿真中单例模式的应用
- 生成小区、基站、用户等的ID
- 工厂模式 (还不太明白)
- 生成随机数类
- 其他所有只需要一个实例化对象的类,如载波、带宽等等