【设计模式】单例模式 (Singleton)

一、单例模式 Singleton(2018/12/18 周二)

要求: 在内存中只能创建一个对象

1. 该对象不能是栈(全局)对象

2. 该对象只能放在堆中

应用场景:

1. 直接替换任意的全局对象(变量)//因为全局对象越少越好

2. 配置文件

3. 词典类

实现步骤:

1. 将构造函数私有化

2. 在类中定一个静态的指针对象(一般设置为私有),并且在类外初始化为空

3. 定义一个返回值为类指针的静态成员函数,如果2中的指针对象为空,则初始化对象,以后在有对象调用该静态成员函数的时候,不再初始化对象,而是直接返回对象,保证类在内存中只有一个对象

 

 1 #include <iostream>
 2 using std::cout;
 3 using std::endl;
 4 
 5 //要求: 在内存中只能创建一个对象
 6 //1. 该对象不能是栈(全局)对象
 7 //2. 该对象只能放在堆中
 8 
 9 //应用场景:
10 //1. 直接替换任意的全局对象(变量)//因为全局对象越少越好
11 //2. 配置文件
12 //3. 词典类
13 
14 //实现步骤:
15 //1. 将构造函数私有化
16 //2. 在类中定一个静态的指针对象(一般设置为私有),并且在类外初始化为空
17 //3. 定义一个返回值为类指针的静态成员函数,
18 //      如果2中的指针对象为空,则初始化对象,以后在有对象调用该静态成员函数的时候,不再初始化对象,
19 //      而是直接返回对象,保证类在内存中只有一个对象
20 
21 class Singleton {
22 public:
23     static Singleton* getInstance() {  //不是静态的成员函数就没法调用,因为没有对象,需要类名调用
24         if (_pInstance == 0) {
25             _pInstance = new Singleton(); //在类内部调用构造函数
26         }
27         return _pInstance;
28     }
29     static void destory() {
30         if (_pInstance) {
31             delete _pInstance;   
32         }
33     }
34     void print() {
35         printf("Singleton::print() \n");
36     }
37 private:
38     Singleton() {
39         cout << __FUNCTION__ << endl;
40     }
41     ~Singleton() {
42         cout << __FUNCTION__ << endl;
43     }
44     static Singleton* _pInstance;
45 };
46 
47 
48 //Singleton s3; //error
49 //static Singleton s4; //error
50 
51 Singleton * Singleton::_pInstance = 0;
52 
53 int main() {
54     //Singleton s1; //栈对象, error,必须让该语句无法编译通过
55     //Singleton s2;
56     //Singleton *p1 = new Singleton();
57     Singleton* p1 = Singleton::getInstance();
58     Singleton* p2 = Singleton::getInstance();
59     printf("p1 = %p \n", p1);
60     printf("p2 = %p \n", p2);
61     p1->print();
62     p1->destory();
63     //delete p1; //error, 希望该语句编译无法通过
64     return 0;
65 }
View Code

 

posted @ 2018-12-18 16:40  zhangwanying  阅读(167)  评论(0编辑  收藏  举报