单例模式
Posted 编程猿来如此
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。
上篇文章记录了 C++ 中限制一个类只生成一个实例的方法,本文在此基础上进行扩展:限制某个类最多只能有 n 个实例对象。
①.对象创建会调用构造函数,对象销毁会调用析构函数,因此可以在构造和析构函数中进行数量的记录。
②.使用静态成员变量记录类的实例数量。
③.构造函数定义为 private,然后提供另外的构造函数用于创建对象。
class Anyleton
{
public:
class TooManyObj{};//异常
~Anyleton()
{
--curObjCount;
}
static const int maxObjCount = 10;//最大实例个数
static int curObjCount ;
static Anyleton * getAnyleton()
{
return new Anyleton();
}
static Anyleton *getAnyleton( const Anyleton & obj)
{
return new Anyleton(obj);
}
private:
Anyleton()
{
if( curObjCount >= maxObjCount )
throw TooManyObj();
++curObjCount;
}
Anyleton(const Anyleton &)
{
if( curObjCount >= maxObjCount )
throw TooManyObj();
++curObjCount;
}
};
template <typename T>
class AnyletonTemple
{
public:
class TooMantObj{};
static int getCurObjCount(){ return curObjCount ;}
protected:
AnyletonTemple()
{
init();
}
AnyletonTemple(const AnyletonTemple &)
{
init();
}
~AnyletonTemple()
{
--curObjCount;
}
private:
static const int maxObjCount ;
static int curObjCount;
void init()
{
if( curObjCount >= maxObjCount )
throw TooMantObj();
++curObjCount;
}
};
class AnyletonExample:private AnyletonTemple<AnyletonExample>
{
public:
static AnyletonExample * getAnyletonObj(){ return new AnyletonExample() ;}
static AnyletonExample * getAnyletonObj(const AnyletonExample & obj){ return new AnyletonExample(obj) ;}
~AnyletonExample(){};
using AnyletonTemple<AnyletonExample>::TooMantObj;
using AnyletonTemple<AnyletonExample>::getCurObjCount;
private:
AnyletonExample(){};
AnyletonExample(const AnyletonExample &){}
};
template<typename AnyletonExample>
int AnyletonTemple<AnyletonExample>::curObjCount = 0;
template<typename AnyletonExample>
const int AnyletonTemple<AnyletonExample>::maxObjCount = 3;
单例模式:
以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章