第六十二课、单例类模板
一、单例模式(一个类只有一个对象,且单例模式一般不用释放)
1、要控制类的对象数目,必须对外隐藏构造函数
(1)、将构造函数的访问属性设置为private
(2)、定义instance并初始化为NULL
(3)、当需要使用对象时,访问instance的值
A、空值:创建对象,并用instance标记
B、非空值:返回instance标记的对象
#include<iostream> using namespace std; class Object { static Object* c_instance;//c_instance用来记录对象 Object();//隐藏构造函数、拷贝构造函数、赋值操作符 Object(const Object& obj); Object& operator = (const Object& obj); public: static Object* GetInstance(); void print(); }; Object* Object::c_instance = NULL; Object::Object() { } Object* Object::GetInstance() { if(c_instance == NULL) { c_instance = new Object(); } return c_instance; } void Object::print() { cout << c_instance << endl; } int main() { Object* p1 = Object::GetInstance(); Object* p2 = Object::GetInstance(); Object* p3 = Object::GetInstance(); p1->print(); p2->print(); p3->print();//最后三个值都一样,说明指向同一个对象 return 0; }
二、存在的问题及解决方法
1、存在的问题
(1)、必须定义静态成员变量m_instance
(2)、必须定义静态成员函数GetInstance
2、解决方法
(1)、将单例模式相关的代码抽取出来,开发单例类模板
(2)、当需要单例时,直接使用单例类模板
#ifndef _SINGLETON_H_ #define _SINGLETON_H_ template < typename T > class Singleton { static T* c_instance; public: static T* GetInstance(); }; template < typename T > T* Singleton<T>::c_instance = NULL; template < typename T > T* Singleton<T>::GetInstance() { if(c_instance == NULL) { c_instance = new T(); } return c_instance; } #endif
#include<iostream> #include"Singleton.h" using namespace std; class Test { friend class Singleton<Test>;//说明这个类要使用单例模式 Test(){};//记得定义构造函数 Test(const Test& obj); Test& operator = (const Test& obj); public: void print() { cout << "this = " << this << endl; } }; int main() { Test* p1 = Singleton<Test>::GetInstance(); Test* p2 = Singleton<Test>::GetInstance(); Test* p3 = Singleton<Test>::GetInstance(); p1->print(); p2->print(); p3->print(); return 0; }
三、小结
(1)、单例模式是开发中最常用的设计模式之一
(2)、单例模式的应用使得一个类最多只有一个对象
(3)、可以将单例模式相关的代码抽象成类模板
(4)、需要使用单例模式的类直接使用单例类模板