模板实现单例模式包装器
单例模式是一种常用的软件设计模式,它的核心包含一个特殊的类,单例模式可以保证程序运行过程中有且仅有一个实例,也就是一个对象。单例模式的特点为:
1、构造函数私有;
2、析构函数私有;
3、拷贝构造函数私有。
单例模式包装器是指用一个单例模板类A,将一个已存在的类B包装成类C,以此来实现多个不同类的单例模式。请看下边的代码:
1 /* 2 2018.7.22 3 模板实现单例模式包装器 4 by Chenyuxiang 5 */ 6 #include <iostream> 7 #include <cstdlib> 8 using namespace std; 9 10 template <class T> 11 class Single{ 12 private: 13 Single(){} 14 ~Single(){} 15 Single(const Single& cs){} 16 Single& operator=(const Single&){} 17 static void Init(){ 18 m_pinst = new T(); 19 } 20 static void Destroy(){ 21 delete m_pinst; 22 m_pinst = NULL; 23 } 24 static T* m_pinst; 25 26 public: 27 static T& Getinstance(){ 28 if(!m_pinst) 29 { 30 Init(); 31 atexit(Destroy); 32 } 33 return *m_pinst; 34 } 35 }; 36 template <class T> 37 T* Single<T>::m_pinst = NULL; 38 39 class Application{ 40 public: 41 Application(){cout << "construct..." << endl;} 42 ~Application(){cout << "desconstruct..." << endl;} 43 void Run(){cout << "Run..." << endl;} 44 }; 45 46 typedef Single<Application> Applicate; 47 48 int main(int argc,char* argv[]) 49 { 50 Applicate::Getinstance().Run(); 51 Applicate::Getinstance().Run(); 52 return 0; 53 }
运行结果如下:
我们可以看到,Application的构造函数和析构函数只调用了一次,说明程序运行过程中有且仅有一个Application类对象。但存在的该对象是可以多次调用静态成员函数Run()的。
*值得注意的是,我将Single<Application>重命名为Applicate,因此Applicate是单例类,而Application依然是普通类,仍然可以在同一个程序中创建多个对象。
温润如玉,坚毅如铁。