单例模式

Posted 编程猿来如此

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。






点击上方“蓝字”,发现更多精彩。

上篇文章记录了 C++ 中限制一个类只生成一个实例的方法,本文在此基础上进行扩展:限制某个类最多只能有 n 个实例对象。


限制类对象个数


01
PART
实现说明

①.对象创建会调用构造函数,对象销毁会调用析构函数,因此可以在构造和析构函数中进行数量的记录。

②.使用静态成员变量记录类的实例数量。

③.构造函数定义为 private,然后提供另外的构造函数用于创建对象。


02
PART
代码示例
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; }};



模版基类

当有多个类需要控制实例数量时,可以采用模版及继承的方式实现代码复用。

01
PART
模版基类
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; }};



02
PART
派生类
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;


单例模式:






扫码关注

持续获取最新文章
c++学习 算法与数据结构

以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块