c++中的单例模式
今天正好看了一节c++的网课(其实就课件和代码),就记录一下。
所谓单例模式是指一个类只允许有一个实例,虽然这是设计模式里比较重要的一个概念,但是由于接触工业产品较少,所以概念也是很模糊的。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。简而言之,设计的思路就是把类的构造函数声明为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
#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; }View Code
说实话,下面这个代码看起来也好看,思路也更清晰,扩展性强,模板真好用。
更多精彩

