单例的实现要点
单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法)。
## 单例的实现主要是通过以下三个步骤:
1.将类的构造方法定义为私有方法。这样其他类的代码就无法通过调用该类的构造方法来实例化该类的对象,只能通过2·该类提供的静态方法来得到该类的唯一实例。
3.定义一个私有的类的静态实例。
4.提供一个公有的获取实例的静态方法。## **单例追求的目标**
线程安全。
懒加载。
调用效率高。以下是懒汉模式实现:
懒汉模式在多线程情况下是线程不安全的,所以下面的实现已经加互斥锁,所以不存在线程安全问题,使用智能指针防止内存泄漏
class LazySingleton
{private:explicit LazySingleton();~LazySingleton();explicit LazySingleton(const LazySingleton& lazy) = delete;LazySingleton& operator=(const LazySingleton& lazy) = delete;explicit LazySingleton(LazySingleton&& lazy) = delete;LazySingleton& operator=(const LazySingleton&& lazy) = delete;
public://static LazySingleton* getInstance();static std::shared_ptr<LazySingleton> getInstance();private:static std::shared_ptr<LazySingleton> m_pSmartLazy;//static LazySingleton* m_pLazy;
};
//LazySingleton* LazySingleton::m_pLazy = nullptr;
std::shared_ptr<LazySingleton> LazySingleton::m_pSmartLazy = nullptr;
LazySingleton::LazySingleton()
{}LazySingleton::~LazySingleton()
{}std::shared_ptr<LazySingleton>* LazySingleton::getInstance()
{if (m_pSmartLazy == nullptr){static std::once_flag flag;std::call_once(flag, [&](){if(m_pSmartLazy == nullptr)m_pSmartLazy = std::shared_ptr<LazySingleton>(new LazySingleton());});}return m_pSmartLazy ;
}
以下是饿汉模式实现:
饿汉模式,比较常见的一种写法。在类加载的时候就对实例进行初始化,没有线程安全问题;获取实例的静态方法没有使用同步,调用效率高;但是没有使用懒加载,如果该实例从始至终都没被使用过,则会造成内存浪费。
总结:线程安全、非懒加载、效率高。
是否推荐:可以使用。
class HungrySingleton
{private:explicit HungrySingleton();~HungrySingleton();explicit HungrySingleton(const HungrySingleton& hungry) = delete;HungrySingleton& operator=(const HungrySingleton& hungry) = delete;explicit HungrySingleton(HungrySingleton&& hungry) = delete;HungrySingleton& operator=(const HungrySingleton&& hungry) = delete;
public:static HungrySingleton& getInstance();private:static HungrySingleton m_hungry;
};HungrySingleton HungrySingleton::m_hungry;
HungrySingleton::HungrySingleton()
{std::cout << "hungry creator" << std::endl;
}HungrySingleton::~HungrySingleton()
{}HungrySingleton& HungrySingleton::getInstance()
{return m_hungry;
}

C++单例(懒汉、饿汉)相关推荐

  1. java饿汉式有啥作用,Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?...

    什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的.如果重复 ...

  2. 单例模式(懒汉单例和饿汉单例)

    转载于:http://www.manongjc.com/article/53899.html ==单例模式就是指一个类在整个程序中只有一个实例.==确保一些不需要重复创建的类创建多余的实例.特别是某些 ...

  3. 单例设计模式-饿汉式

    可以说是单例模式中写法最简单的一个方式,这个就是饿汉式,也就是在类加载的时候,就完成实例化,那他虽然简单,有没有什么值得研究的地方呢,当然是有的,首先我们先完成一个饿汉式的简单实现 package c ...

  4. 懒汉式单例和饿汉式单例优缺点

    1.时间和空间 比较上面两种写法:懒汉式是典型的时间换空间,也就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间.当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间. 饿汉式 ...

  5. 设计模式之单例设计模式(饿汉式)

    //饿汉式:类一加载就创建 //创建单例对象 package july.star.thread22;/*** Student* 创建单例对象* @author MoXingJian* @email 9 ...

  6. 单例模式(懒汉式单例和饿汉式单例)

    /** 饿汉式单例*/ class Singleon{private static final Singleon singleon = new Singleon();private Singleon( ...

  7. 创建型模式:单例模式(懒汉+饿汉+双锁校验+内部类+枚举)

    单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...

  8. 单例模式,懒汉饿汉,线程安全,double checked locking的问题

    概览 本文目的 单例 饿汉模式 懒汉模式 线程安全的Singleton实现 懒汉普通加锁 double checked locking double checked locking 靠不住? 静态局部 ...

  9. 单例模式(懒汉 饿汉)

    单例模式 设计模式: 设计模式是一套被大部分人所接受的,总结的,具有代表性的代码模式.设计模式面向对象的.主要对代码复用性,重用性,可维护性,通用性 设计模式总共就23种 实际是对代码的设计. 六大设 ...

最新文章

  1. ryu和mysql实现控制_openflow的初步认识及RYU控制器实践
  2. html财务统计,财务统计.html · 珠烟/layuiadmin-templete - Gitee.com
  3. AOJ0033 Ball【贪心+序列处理】
  4. newman的键盘不错
  5. CSS学习16之层级
  6. 开发人员能力不足的情况下如何推进敏捷开发?
  7. linux 解析pdf下载工具,Linux高级系统级性能分析工具-perf.pdf
  8. 条件概率 and 条件概率的链式法则 and 期望、方差和协方差
  9. 软考信息安全工程师考试历年真题汇总及试题分布统计
  10. 同一目录下拷贝文件夹里_protobuf在C++下的安装使用
  11. DeepLearningAI 学习笔记 1.3 浅层 logistic 神经网络
  12. 谈话《百度搜索引擎的网页质量白皮书》
  13. SQL Server同实例下不同数据库表的同步(job实现)
  14. IE下table的innerHTML无效的处理方法
  15. mybatisplus中的xml对象参数传递
  16. 四选一多路选择器的设计与仿真
  17. 朴素贝叶斯之邮件分类
  18. (四.2)计算机组成原理笔记——存储器(静态RAM和动态RAM的区别,动态RAM的刷新, ROM……)
  19. 轩小陌的Python笔记-day09 文件操作相关
  20. AtCoder Beginner Contest 275 A-D题解

热门文章

  1. 程序员过中秋的一百种方式
  2. 原创设计和尖端创新产品齐聚全球最大家具展中国家博会(广州)
  3. 如何'安装linux系统,如何安装linux系统
  4. java毕业设计消防应急管理系统源码+lw文档+mybatis+系统+mysql数据库+调试
  5. Beetlsql的笔记
  6. 【有限元分析】卷扬机卷筒心轴静力学分析
  7. 大一新生 现阶段的未来的发展目标
  8. 程序员深夜逆行被拦后崩溃:老板在催我!女朋友在催我!
  9. redis源码修改之zincrby,hincrby命令
  10. 【题解】洛谷P4168 [Violet]蒲公英 (分块)