【C++】C++ 单例模式总结(5种单例实现方法) |
您所在的位置:网站首页 › 学校创建特色的几种基本模式是什么 › 【C++】C++ 单例模式总结(5种单例实现方法) |
本文对 C++ 的单例模式进行简单介绍和实现。 参考: C++ 线程安全的单例模式总结(强烈建议阅读原文,本文相当于做了总结,留作学习,并添加了一种新的单例方法 std::call_once ) 目录 文章目录 目录1. 什么是单例模式为什么需要单例模式线程安全单例模式分类单例类的特点 2. 单例模式实现普通懒汉式单例(线程不安全)静态局部变量的懒汉单例(推荐)加锁的懒汉式单例方法1:返回普通指针方法2:返回智能指针 使用 C++11 std::call_once 实现的懒汉单例饿汉式单例 1. 什么是单例模式单例模式是指在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性。 为什么需要单例模式两个原因: 节省资源。一个类只有一个实例,不存在多份实例,节省资源。方便控制。在一些操作公共资源的场景时,避免了多个对象引起的复杂操作。但是在实现单例模式时,需要考虑到线程安全的问题。 线程安全 什么是线程安全?在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 如何保证线程安全? 给共享的资源加把锁,保证每个资源变量每时每刻至多被一个线程占用。让线程也拥有资源,不用去共享进程中的资源。如:使用threadlocal可以为每个线程维护一个私有的本地变量。 单例模式分类单例模式可以分为 懒汉式 和 饿汉式 ,两者之间的区别在于创建实例的时间不同。 懒汉式系统运行中,实例并不存在,只有当需要使用该实例时,才会去创建并使用实例。这种方式要考虑线程安全。 饿汉式系统一运行,就初始化创建实例,当需要时,直接调用即可。这种方式本身就线程安全,没有多线程的线程安全问题。 单例类的特点 构造函数和析构函数为私有类型,目的是禁止外部构造和析构。拷贝构造函数和赋值构造函数是私有类型,目的是禁止外部拷贝和赋值,确保实例的唯一性。类中有一个获取实例的静态方法,可以全局访问。 2. 单例模式实现单例的经典实现方式是「静态局部变量的懒汉单例」,推荐使用这种方式。 关于单例实现可以读下 stack overflow 上 这个回答 。 普通懒汉式单例(线程不安全)这种情况是线程不安全的,不作详细介绍。 下面这几种实现都是线程安全的。 静态局部变量的懒汉单例(推荐)这种方式在 C++11 下是线程安全的。这种单例实现方式称为 Meyer’s Singleton 。 头文件: /// 内部静态变量的懒汉实现 // class Single { public: // 获取单实例对象 static Single& GetInstance(); // 打印实例地址 void Print(); private: // 禁止外部构造 Single(); // 禁止外部析构 ~Single(); // 禁止外部拷贝构造 Single(const Single &single) = delete; // 禁止外部赋值操作 const Single &operator=(const Single &single) = delete; };源文件: Single& Single::GetInstance() { /** * 局部静态特性的方式实现单实例。 * 静态局部变量只在当前函数内有效,其他函数无法访问。 * 静态局部变量只在第一次被调用的时候初始化,也存储在静态存储区,生命周期从第一次被初始化起至程序结束止。 */ static Single single; return single; } void Single::Print() { std::cout |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |