一、单例模式 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() "); 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 ", p1); 60 printf("p2 = %p ", p2); 61 p1->print(); 62 p1->destory(); 63 //delete p1; //error, 希望该语句编译无法通过 64 return 0; 65 }