这几天研究起来单例模式,这对日常工程来说还是比较常见,例如配置文件等就需要用单例模式来声明。
由于厌烦的单例模式代码反复的重写,这几天想了不少的方法。而目前,只想到一种方法,就是用宏来做对应的声明。
我采用的单例模式是利用私有化构造函数来实现的,这个方法是最简单也是最基本的,多线程下是否可用有待考究。
1 #define INITIALIZE_SINGLETON_CLASS(ClassName)\ 2 ClassName*ClassName::m_this = NULL; 3 4 #define OBTAIN_SINGLETON_CLASS(ClassName)\ 5 ClassName::obtain##ClassName(); 6 7 #define RELEASE_SINGLETON_CLASS(ClassName)\ 8 ClassName::release##ClassName(); 9 10 #define ANNOUNCEMENT_SINGLETON_CLASS(ClassName)\11 private:\12 static ClassName* m_this;\13 private:\14 ClassName(){};\15 ~ClassName(){};\16 public:\17 static ClassName& obtain##ClassName()\18 {\19 if(!m_this) m_this = new ClassName();\20 return (*m_this);\21 }\22 static void release##ClassName()\23 {\24 if(m_this) delete m_this;\25 m_this = NULL;\26 }\27 public:28 29 #define ObtainSingletonClass(ClassName) OBTAIN_SINGLETON_CLASS(ClassName)30 #define ReleaseSingletonClass(ClassName) RELEASE_SINGLETON_CLASS(ClassName)
这组宏中,声明了一个ANNOUNCEMENT_SINGLETON_CLASS宏,用在类的声明中;INITIALIZE_SINGLETON_CLASS宏,用于初始化全局唯一静态变量;
另外的两个宏OBTAIN_SINGLETON_CLASS和RELEASE_SINGLETON_CLASS则是用于获取和释放该类的全局唯一对象。
使用的时候很简单,比如声明一个配置管理类:
1.在类.h文件中添加声明ANNOUNCEMENT_SINGLETON_CLASS宏,
1 // SystemConfig.h3 class SystemConfig4 {5 ANNOUNCEMENT_SINGLETON_CLASS(SystemConfig);6 };
2.在.cpp文件中添加初始化INITIALIZE_SINGLETON_CLASS宏,
1 // SystemConfig.cpp3 INITIALIZE_SINGLETON_CLASS(SystemConfig);
这样就可以了。
具体使用的时候:
可以通过函数:obtian##ClassName来获取全局唯一实例对象,通过release##ClassName来释放全局唯一对象;或者利用两组宏OBTAIN_SINGLETON_CLASS和RELEASE_SINGLETON_CLASS
当然,为了编码规范,我还另外将这两个宏专门声明成骆驼表示法的函数形式,让代码看起来更整洁。