模板实现单例模式包装器

单例模式是一种常用的软件设计模式,它的核心包含一个特殊的类,单例模式可以保证程序运行过程中有且仅有一个实例,也就是一个对象。单例模式的特点为:

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依然是普通类,仍然可以在同一个程序中创建多个对象。

温润如玉,坚毅如铁。
原文地址:https://www.cnblogs.com/heisen/p/9351456.html