C++ Singleton的实现方法

  • 一、Singleton的实现方法
  • 二、定义只能在栈\堆上存在的对象

一、Singleton的实现方法

Singleton模式的要求:一个系统中有且只能有一个指定类的实例

Singleton的一般实现步骤

  1. 将构造函数私有化
  2. 在类中指定一个静态的指向本类型 的指针变量
  3. 定义一个返回值为类指针的静态成员函数
    代码实现
class Singleton1{private:Singleton1(){printf("constructor\n");}~Singleton1(){printf("destructor\n");};public:static Singleton1* _instance;static Singleton1* getInstance();static void destory();
}
//静态对象初始化
Singleton1* Singleton1::_instance = nullptr;
//定义获取实例的函数和释放实例的函数//风险点在于此函数是线程不安全的,存在多个线程同时进入else 循环创建实例的情况
Singleton1*  Singleton1::getInstance(){if(_instance) printf("instance already exist\n");else _instance = new Singleton1();return _instance;
}void Singleton1::destory(){if(_instance==nullptr) printf("instance already deleted\n");else delete _instance;
}

改进方案

  1. 创建和删除对象指针时,存在线程不安全的情况。考虑以下改进方案

    • 在初始化静态变量时,即创建实例,后续函数只能获取其值
    • 对静态成员加锁
    • 使用Linux pthread库中的pthread_once或C++11中的call_once,规定其执行一次
  2. 一开始就初始化了静态变量,造成了不必要的空间浪费。可以考虑将其定义在静态函数内部。
class Singleton1{private:Singleton1(){printf("constructor\n");}~Singleton1(){printf("destructor\n");};public:static Singleton1* _instance;static Singleton1* getInstance();static void destory();
}
//静态对象初始化
Singleton1* Singleton1::_instance = nullptr;
//定义获取实例的函数和释放实例的函数//风险点在于此函数是线程不安全的,存在多个线程同时进入else 循环创建实例的情况
Singleton1*  Singleton1::getInstance(){if(_instance) printf("instance already exist\n");else _instance = new Singleton1();return _instance;
}void Singleton1::destory(){if(_instance==nullptr) printf("instance already deleted\n");else delete _instance;

二、定义只能在栈\堆上存在的对象

  1. 只能在栈空间上存在的对象,在栈上可以存在的必要条件时构造函数和析构函数不是private类型。
    不能使用new 运算符创建新的类。
    所以考虑重载operator new 和 operator delete 并将其作为private成员
  2. 只能在堆空间上存在的对象:
    不能在栈上面创建,可以使用new创建
    考虑将其析构函数作为private成员,此时如果在栈上创建对象,则在栈回收时就无法调用相应的析构函数,因此编译器会报错,无法通过。

C++ Singleton的实现方法相关推荐

  1. 【面试系列】6种单例模式(Singleton)实现方法比较

    转载文章,文章经 LiteCodes 授权,转载至本博客. 原文地址:[面试系列]6种单例模式(Singleton)实现方法比较 下述代码均省略了 Singleton 类的业务代码段,仅表现作为单例所 ...

  2. C++中实现Singleton的正确方法

    如果某个类管理了系统中唯一的某种资源,那么我们只能创建该类的一个实例,此时用到singleton设计模式(后面为了简化将省略"设计模式"四个字)就比较合适了.然而,如果不注意实现方 ...

  3. Laravel Ioc容器singleton和bind方法的区别

    Laravel中使用Ioc容器的singleton方法和bind方法创建实例有什么区别呢?它们两个都是返回一个类的实例,不同的是singleton是单例模式,而bind是每次返回一个新的实例,看下面的 ...

  4. 设计模式——3单例模式(Singleton)

    3.单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比 ...

  5. 单件模式(Singleton Pattern)

    单件模式(Singleton Pattern) 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只 ...

  6. .NET设计模式(2):单件模式(Singleton Pattern)

    转载:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 单件模式(Singleton Pattern) --.NET设计模式系列之二 ...

  7. 在Java中实现单例模式的有效方法是什么? [关闭]

    在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...

  8. 设计模式(创建型模式)——单例模式(Singleton)

    2019独角兽企业重金招聘Python工程师标准>>> 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这 ...

  9. 细颗粒度Singleton模式实现

    作为一个很典型的设计模式,Singleton模式常常被用来展示设计模式的技巧,并且随着技术的演进,.NET语言和Java都已经把经典<Design Patterns : Elements of ...

最新文章

  1. 【攻防世界013】elrond32
  2. java正则表达式匹配数字范围_在java中怎么利用正则表达式匹配数字
  3. linux下面使用cpdf合并pdf
  4. python库快速安装_python的pip快速安装代码
  5. LeetCode-654. 最大二叉树
  6. 特斯拉已撤回德国电池工厂建厂补贴申请 原有望获得近13亿美元
  7. SQL Server和Oracle的差异
  8. PHP 开发邀请功能,使用 larainvite 为 Laravel 5.3 应用添加邀请注册功能
  9. 2012,字王强势回归
  10. python是什么意思中文-python是什么意思中文翻译
  11. 苹果手机越狱后cydia的问题Could not open file - open
  12. 【0201】用户登录界面设计
  13. JDK1.6安装_BouncyCastle JCE扩展加密算法解决JDK1.6 sftp连接openssh8.6Algorithm negotiation fail问题
  14. 汽车零部件行业需求分析及解决方案
  15. 常用html5阅览器,最好的网页浏览器排行,速度最快的四大浏览器分享
  16. 编程基本功训练:流程图画法及练习
  17. 记一次有授权的渗透测试
  18. 一个所谓的“文字创作者”的焦虑
  19. 2022-2028年中国祭祀用品行业市场竞争状况及发展趋向分析报告
  20. Python 实现 GIF 动图以及视频卡通化,两脚踢碎次元壁

热门文章

  1. fMRI 公开数据集整理
  2. k8s 配置 Secret 集成Harbor
  3. 3个小球放入4个盒子
  4. NVIDIA_CUDA版本查看方法_WIN10
  5. 抖音短视频数据抓取实战系列(〇)——前言
  6. 使用bedtools进行gwas基因注释
  7. 青少年软件编程C++三级题库(1-10)
  8. android+单机button+设置背景图片,button设置点击更改背景图片
  9. java中考勤管理_JAVA人事员工考勤管理(含论文)源码
  10. moviepy音视频开发:音频合成类AudioArrayClip介绍