c++中的单例类模板的实现方法详解

 更新时间:2020年03月16日 09:40:29   作者:PRO_Z  
这篇文章主要介绍了c++中的单例类模板的实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

 1、什么是单例模式

  在架构设计时,某些类在整个系统生命周期中最多只能有一个对象存在 ( Single Instance )。如超市收银系统,其外观主要由显示器(1个)、扫描枪(1个)、收款箱(1个)组成,在系统正常运行期间这三部分都是唯一存在的;也就是说,显示器、扫描枪、收款箱这三部分都应该有各自的类,并且每个类只能唯一地实例化一个对象,基于这种模式的程序设计,称为单例模式。

  !!!单例模式只能创建一个对象,且该对象的生命周期伴随系统的整个运行期间。

2、怎么实现单例模式

  思考:如何定义一个类,使得这个类最多只能创建一个对象?

  分析:因为对象是由构造函数创建的,所以我们应该将问题锁定在构造函数上;又因为只能创建一个对象,这就意味着只能调用一次构造函数;显然将构造函数的访问权限设置为 public 不合适,所以,构造函数的访问权限只能是 private。然后,定义一个私有的静态成员 c_instance = NULL 和 公有的静态成员函数,通过  c_instance 来判断是否创建对象。(这个为什么要使用 静态成员呢?因为构造函数是私有的,在类的外部无法创建对象,只能通过类名调用静态成员,而静态成员函数只能调用静态成员变量)

  上述分析过程可简化为:

  (1)将构造函数的访问属性设置为 private;

  (2)定义私有的静态成员属性 instance 并初始化为 NULL;

  (3)当需要使用对象时,访问 instance 的值;

           1)空值:创建对象,并用 instance 标记;

           2)非空值:返回 instance 标记的对象;

单例模式实现

#include <iostream>
#include <string>

using namespace std;

class SObject
{
  static SObject* c_instance; // 定义标识符指针;

  /* 不需用拷贝和赋值,在单例模式中,始终只有一个对象 */  
  SObject(const SObject&);
  SObject& operator= (const SObject&);
  
  SObject() // 私有的构造函数
  {
  }
public:
  static SObject* GetInstance();  // 创建对象的入口
  
  void print()
  {
    cout << "this = " << this << endl;
  }
};

SObject* SObject::c_instance = NULL; // 静态成员类内声明,类外定义

SObject* SObject::GetInstance() // 单例模式的关键
{
  if( c_instance == NULL )
  {
    c_instance = new SObject();
  }
  
  return c_instance;
}

int main()
{
  SObject* s = SObject::GetInstance();
  SObject* s1 = SObject::GetInstance();
  SObject* s2 = SObject::GetInstance();
  
  s->print();  // this = 0x940a008
  s1->print(); // this = 0x940a008
  s2->print(); // this = 0x940a008
  
  return 0;
}
// 注:单例模式中,对象的生命周期存在整个系统运行过程中,所以是绝对不释放的;

 ·   其实,在上述的单例模式实现案列中,有一部分代码(分析过程中第2、3步)与类本身没有任何关系,既然是这样,我们就把这部分单独提取出来处理。

  问题所在:需要使用单例模式时,必须在每个类中定义 静态成员变量 c_instance 和 静态成员函数 GetInstance();当有多个类都需要使用单例模式时,这样的实现方式明显的很冗余,为了能够代码复用,我们可以 将这两部分抽象成一个新类(做成类模板,声明为其它类的友元类,这样与之前的效果一样)。

基于类模板的单例模式实现

 // 对上个单例模式实现代码的改进

// singleton.hpp 单例模式代码
#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

// main.cpp 测试文件
#include <iostream>
#include <string>
#include "singleton.hpp"

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();  // 0xe63c20
  s1->print(); // 0xe63c20
  s2->print(); // 0xe63c20
  
  return 0;
}

  在今后工作中,如果一个类(SObject)要使用单例模式(Singleton 单例模式的类模板),只需三步骤:

  (1)类(SObject)的构造函数必须私有化;同时,拷贝构造函数、重载=操作符 也私有化;

  (2)将单例模式的类模板声明为这个类的友元类; friend class Singleton<SObject>;

  (3)通过 单例模式类模板中 SObject* s = Singleton<SObject>::GetInstance(); 创建对象。

到此这篇关于c++中的单例类模板的实现方法详解的文章就介绍到这了,更多相关c++ 单例类模板内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++深浅拷贝和写时拷贝图文详解

    C++深浅拷贝和写时拷贝图文详解

    这篇文章主要给大家介绍了关于C++深浅拷贝和写时拷贝的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C++的静态联编和动态联编详解

    C++的静态联编和动态联编详解

    这篇文章主要介绍了C++的静态联编和动态联编详解,对于深入理解C++编译运行原理有很大帮助,需要的朋友可以参考下
    2014-07-07
  • VisualStudio2019配置OpenCV4.5.0的方法示例

    VisualStudio2019配置OpenCV4.5.0的方法示例

    这篇文章主要介绍了VisualStudio2019配置OpenCV4.5.0的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C++中变量的类型与作用域学习教程

    C++中变量的类型与作用域学习教程

    这篇文章主要介绍了C++中变量的类型与作用域,C++是面向对象的编程语言,一定要注意局部变量与全局变量的作用范围,需要的朋友可以参考下
    2016-05-05
  • C语言字符串快速压缩算法代码

    C语言字符串快速压缩算法代码

    这篇文章主要介绍了C语言字符串快速压缩算法代码,将字符串中连续出席的重复字母进行压缩,其主要的压缩字段的格式为”字符重复的次数+字符”。有需要的小伙伴参考下吧。
    2015-03-03
  • C++ 类的静态成员深入解析

    C++ 类的静态成员深入解析

    在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象
    2013-09-09
  • Windows上CLion的配置步骤详解

    Windows上CLion的配置步骤详解

    这篇文章主要介绍了Windows上CLion的配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • 减少OpenCV读取高分辨率图像的时间示例

    减少OpenCV读取高分辨率图像的时间示例

    今天小编就为大家分享一篇减少OpenCV读取高分辨率图像的时间示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 深入C++中struct与class的区别分析

    深入C++中struct与class的区别分析

    本篇文章是对C++中struct与class的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 常用的C语言排序算法(两种)

    常用的C语言排序算法(两种)

    本文给大家分享两种常用的C语言排序算法,代码非常简单,感兴趣的朋友可以参考下
    2016-09-09

最新评论