c++中的单例模式
今天正好看了一节c++的网课(其实就课件和代码),就记录一下。
所谓单例模式是指一个类只允许有一个实例,虽然这是设计模式里比较重要的一个概念,但是由于接触工业产品较少,所以概念也是很模糊的。
简而言之,设计的思路就是把类的构造函数声明为private,然后提供一个公共的接口是外部能够访问到类的实例
#ifndef _SINGLETON_H_ #define _SINGLETON_H_ using namespace std; class SingleTon { public: static SingleTon* GetInstance() { if(mp == NULL) mp = new SingleTon(); return mp; } void print_this() { cout<<"address:"<<this<<endl; } private: static SingleTon* mp; SingleTon(){}; SingleTon(const SingleTon&){}; SingleTon operator =(const SingleTon&){}; }; SingleTon* SingleTon::mp = NULL; #endif
#include <iostream> #include "SingleTon.h" int main(int argc, char const *argv[]) { SingleTon* t1 = SingleTon::GetInstance(); SingleTon* t2 = SingleTon::GetInstance(); t1->print_this(); t2->print_this(); return 0; }
代码写的比较渣,总之就是给一个可以访问的指针,只分配一次内存。
然后又看见一种定义模板类来实现单例的方法,这种方法就是将单例模式的类都同一抽象定义为模板类,后面要用到的类都可以直接套用
#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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string> #include "Singleton.h" using namespace std; class SObject { friend class Singleton<SObject>; //该类使用到单例 SObject(const SObject&); SObject& operator= (const SObject&); SObject() { } public: void print() { cout << "this = " << this << endl; } }; int main() { SObject* s = Singleton<SObject>::GetInstance(); SObject* s1 = Singleton<SObject>::GetInstance(); SObject* s2 = Singleton<SObject>::GetInstance(); s->print(); s1->print(); s2->print(); return 0; }
说实话,下面这个代码看起来也好看,思路也更清晰,扩展性强,模板真好用。