这是两种典型的懒汉模式(防止资源泄露)的实现,但不保证线程安全

  • 类内嵌套自定义的用于释放资源的类
#include<iostream>class Singleton
{public:static Singleton* get_singleton(){if(Singleton::singleton == nullptr){Singleton::singleton = new Singleton();}return Singleton::singleton;}private:static Singleton* singleton;
private:class Deletor{public:Deletor(){std::cout<<"Deletor is createed!\n";}~Deletor(){if(Singleton::singleton != nullptr){delete Singleton::singleton;Singleton::singleton = nullptr;}}};
private:Singleton(){static Deletor deletor;std::cout<<"Ctor is called!\n";}~Singleton(){std::cout<<"Dtor is called!\n";}Singleton(const Singleton&);Singleton(Singleton&&);Singleton& operator=(const Singleton&);
};Singleton* Singleton::singleton = nullptr;void test()
{Singleton::get_singleton();
}int main()
{test();return 0;
}

运行结果:

  • 使用智能指针std::shared_ptr
#include<iostream>
#include<memory>
#include<string>class Singleton
{public:inline static Singleton* Getsingleton(){if(Singleton::singleton.get() == nullptr){Singleton::singleton.reset(new Singleton(),Singleton::DeleteFunction);}return Singleton::singleton.get();}inline static void ShowStr(){std::cout<<Singleton::singleton->test_str<<std::endl;}
private:static std::shared_ptr<Singleton>singleton;static std::string test_str;
private:Singleton(){std::cout<<"Ctor is called!"<<std::endl;}~Singleton(){}Singleton(const Singleton&){}Singleton(Singleton&&){}Singleton& operator=(const Singleton&) = default;
private:static void DeleteFunction(Singleton*);
};std::shared_ptr<Singleton> Singleton::singleton(nullptr);
std::string Singleton::test_str = "test";void Singleton::DeleteFunction(Singleton* ptr) {delete ptr;ptr = nullptr;std::cout<<"Delete function is called!\n";
}void test() {Singleton::Getsingleton()->ShowStr();
}int main(){test();return 0;
}

运行结果:

注意:
1.自定义了shared_ptr的删除器
2.为了与第一种做法统一,传入nullptr初始化,并调用reset()重新分配空间。也可以这样实现:

    inline static Singleton* Getsingleton(){return Singleton::singleton.get();}std::shared_ptr<Singleton> Singleton::singleton(new Singleton(),Singleton::DeleteFunction);

C++单例模式(懒汉模式)实现相关推荐

  1. 单例模式(懒汉模式-双检锁、饿汉模式、静态内部类模式)-详细

    文章目录 前言 单例模式(懒汉模式-双检锁.饿汉模式.静态内部类模式)-详细 01 单例模式是什么? 02 单例模式的好处? 03 单例模式的三种模式 03::01 懒汉模式 03::01::01 问 ...

  2. 单例模式---懒汉模式与饿汉模式

    单例模式:1)一个类只能创建一个实例2)构造函数和静态变量(加载类时即初始化)需为private3)get方法应该为public static,可供全局访问 //懒汉模式 public class l ...

  3. C++单例模式 : 懒汉模式 与 饿汉模式

     单例模式:         只能有一个实例,有懒汉和饿汉区分,实现核心思想:         1.构造函数私有化         2.使用静态函数作为接口来获取类对象 1.懒汉模式:         ...

  4. 大聪明教你学Java设计模式 | 第一篇:单例模式 (懒汉模式和饿汉模式)

    前言 大聪明在写代码的过程中发现设计模式的影子是无处不在,设计模式也是软件开发人员在软件开发过程中面临的一般问题的解决方案.大聪明本着"独乐乐不如众乐乐"的宗旨与大家分享一下设计模 ...

  5. 单例模式 之 单例模式——懒汉模式

    懒汉模式:和饿汉模式不同,懒汉模式并不会一开始声明对象,而是需要等到调用时再声明对象.他很懒,所以你叫"它"它才会动... 代码1: /*** 懒汉模式*/ public clas ...

  6. 单例模式——懒汉模式(C++)

    //懒汉模式 //优点: 第一次使用实例对象时,创建对象 //缺点: 复杂#include <iostream> #include <mutex> #include <t ...

  7. 设计模式——单例模式(懒汉模式,饿汉模式)

    声明: 本博客参考C语言中文网和优秀博客总结得出: (1)C语言中文网链接 (2)优秀博客链接 单例模式的定义: 指一个类只有一个实例,且该类能自行创建这个实例的一种模式.例如,Windows 中只能 ...

  8. 判断double_深入解析单例模式之懒汉模式---Double-Check及volatile关键字

    导读:在日常开发中对单例设计模式的应用十分常见,而看似简单小巧的设计模式其内部却蕴含着丰富的知识点.单例的创建方式有很多如懒汉模式和饿汉模式等.不同的语言又有不同的实现方式,但其本质的思想为:保证一个 ...

  9. Java多线程案例——单例模式(恶汉模式和懒汉模式)

    一,什么是单例模式 单例顾名思义指的是单个实例对象(所以单例模式要求构造方法私有化才能保证在类外不能创建该类的实例化对象):在有的场景中,不应该创建多个对象时就应该使用单例模式,一旦使用了单例模式,此 ...

  10. 单例模式的实现-懒汉模式【大话设计模式之爱你一万年:单例模式:我的女朋友只有你一个】

    2.单例模式的实现-懒汉模式 视频学习地址  -- <大话设计模式之爱你一万年>:https://dwz.cn/wqO0MAy7 这一节我们先来看看一种实现模式,懒汉模式,这也是这么中实现 ...

最新文章

  1. 一个优秀的CIO,应该具备如何的知识体系和管理能力?
  2. Oracle Exadata迈入十年将助企业迈向数位转型之路
  3. C语言程序设计教学探讨,C语言程序设计多媒体教学探讨
  4. java环境变量设置的作用_JDK环境变量的配置及作用
  5. 标准错误处理机制——error
  6. 如何修改WAMP中mysql默认空密码重新登录phpmyadmin
  7. css td 溢出改为省略号
  8. ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql
  9. 将Python和R整合进一个数据分析流程
  10. loadrunner11中文版破解文档+录制脚本(图/文)
  11. 编程语言python入门-Python基础教程,Python入门教程(非常详细)
  12. Matlab实现圆孔夫琅和费衍射
  13. html制作动态3d图片,如何制作3D动态图片?
  14. thinkphp5 域名路由
  15. JAVA实现利用第三方平台发送短信验证码
  16. 做html5抽奖程序xu,用jQuery实现抽奖程序
  17. 云计算技术体系结构由这四点组成
  18. Android 语音遥控器的整体分析-主机端语音解码的添加
  19. 大数据时代的营销思维
  20. 「Medical Image Analysis」 Note on 朱文涛博士学位论文

热门文章

  1. 有关BT5破解wifi密码的流程及当中经历问题的总结——从寻找ISO镜像到破解wifi密码
  2. 【H∞控制】H无穷控制器的matlab仿真
  3. 基于深度学习的图像匹配技术一览
  4. 基于springboot+mysql毕业设计,会议室预约系统
  5. 网络工程师面试常见问题:OSPF篇
  6. hibernate中持久化类的编写规则和主键生成策略
  7. 测试用例设计方法有哪些?
  8. Android 截屏监听分享
  9. 哪有没时间这回事-读后感
  10. 同步回调与异步回调区别