C++设计模式之单例模式(二)

设计模式C++实现(4)——单例模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。单例模式 阅读详情

简介

  单例模式(Singleton Pattern,又称单件模式),是一种使用非常广泛的设计模式。其目的是为了保证一个类之某程序中有且只有一个实例,并且提供了一个全局访问的接口,即该实例是被程序共享的。
  单例模式的类图:

Singleton -$Singleton *unique_instance$ -Singleton() +$Singleton* getInstance()

  单例模式的特征:

  1. 私有化它的构造函数,以防止外界创建该类的实例;
  2. 使用类的私有静态变量指针指向类的唯一实例;
  3. 使用一个共有的静态方法获取该类的实例。

单例模式实现的方式

1.饿汉式

  何为饿汉式?就是在正常情况下,程序进行初始化的时候,已将该对象实例化。后续使用的时候不需要进行初始化。

class Singleton
{
private:
	static Singleton* instance;
private:
	Singleton() {};
	~Singleton() {};
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
public:
	static Singleton* getInstance() 
    {
		return instance;
	}
};

//initialize defaultly
Singleton* Singleton::instance = new Singleton();

  饿汉式的单例对象实在程序的main函数之前进行初始化的,所以是不存在线程安全问题的。

2.懒汉式

  何为懒汉式?就是在正常情况下,我需要用到该对象的时候,才会去初始化该对象(即,在第一次使用的时候被初始化)。

class Singleton
{
private:
	static Singleton* instance;
private:
	Singleton() {};
	~Singleton() {};
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
public:
	static Singleton* getInstance() 
    {
		if(instance == NULL) 
			instance = new Singleton();
		return instance;
	}
};

// init static member
Singleton* Singleton::instance = NULL;
3.线程安全方式

  在使用多线程的时候,若用到懒汉式的方式去实现单例,那么会出现线程不安全的情况;假设有两个线程,pthread_1刚判断完 intance 为NULL 为真,准备创建实例的时候,切换到了pthread_2, 此时pthread_2也判断intance为NULL为真,创建了一个实例,再切回pthread_1的时候继续创建一个实例返回,那么此时就不再满足单例模式的要求了, 既然这样,是因为多线程访问出的问题,那我们就来加把锁,使得线程同步;

class Singleton
{
private:
	static Singleton* instance;	
	static pthread_mutex_t mutex;
private:
	Singleton() {};
	~Singleton() {};
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);
public:
	static Singleton* getInstance() 
    {
    	if (NULL == instance ){
            pthread_mutex_lock(&mutex)
		    if(instance == NULL) 
			    instance = new Singleton();
            pthread_mutex_unlock(&mutex)
        }
		return instance;
	}
};


pthread_mutex_t singleton::mutex;
// init static member
Singleton* Singleton::instance = NULL;
4.泛编方式
template <typename T>
class Singleton {

public:
    static T* GetInstance(){
        static std::once_flag s_flag;
        std::call_once(s_flag, [&](){
            singleton_ptr.reset(new T);
        });

        return singleton_ptr.get();
    }

protected:
    Singleton(){};
    ~Singleton(){};

private:
    static std::shared_ptr<T> singleton_ptr;

    Singleton(const Singleton&) = delete;
    Singleton&operator=(const Singleton&) = delete;
}; // end singleton

template<typename T> std::shared_ptr<T> Singleton<T>::singleton_ptr;

  该方式里面用到了一些C11中的知识,例如std::shared_ptr,std::once_flag,std::call_once;这种方式的优势在于,当某一程序中需要多个不同类型的单例对象的时候,不需要再实现相应的方法,直接继承该类就可以了。如下所示:

class TestClass: public Singleton<TestClass> {
    public:
        TestClass();
        ~TestClass();
    };

使用场合

  1. 系统只需要一个实例对象,或者考虑到资源消耗的太大而只允许创建一个对象;
  2. 客户调用类的单个实例只允许使用一个公共访问点,除了该访问点之外不允许通过其它方式访问该实例 (就是共有的静态方法).
RoboCup救援仿真智能体代码包:从路径规划到通信优化的实战解析 在灾害救援等复杂动态环境中,多智能体协同与实时决策能力直接影响任务成败。RoboCup救援仿真作为经典的智能体研究平台,通过模拟火势蔓延、道路阻塞与伤员状态变化,对路径规划、任务分配和有限带宽通信提出严苛要求。本文解析一套来自国际赛事的完整救援仿真代码包,覆盖A*动态路径规划、贪心任务分配、二进制紧凑通信等核心模块,并给出环境搭建、编译运行及避坑指南。面向参赛队伍与多智能体系统开发者,帮助快速构建高效决策框架。 阅读详情

相关推荐

JMeter脚本录制-快速上手篇

有的项目应用场景下,压测时,需要考虑带宽因素,压测不只是压测接口,静态资源也要一起压测。一般来说,静态资源比较多,如果一个个手工去写请求,是比较繁琐的,此时,可以使用Jmeter的脚本录制功能。 步骤1,创建脚本录制模版。 JMeter菜单:文件>模版,下拉选择到Recording,点击“Create”按钮; 填写录制参数: hostToRecord:填写要录制的主机域名,例如,我们这里填入:www.baidu.com schemeToRecord:填写要录制的模式,例如,htt...

软件测试大叔 5734

C++11的单例模式

C++11中的单例模式分为懒汉模式和饿汉模式。 区别: 懒汉模式:延迟创建,在主动获取对象实例的时候才去创建对象。缺点:多线程时需要安全处理。 饿汉模式:程序初始化即创建 饿汉模式安全写法: static Singleton* GetInstance() { if(singleton_ == nullptr) { std::lock_guard<std::mutex> lock(Singleton::m_lock); .

吸喵高手的小窝 740

深入解析Unity3D中PostLateUpdate突然占用大量时间的原因

在Unity3D的生命周期中,是一个在LateUpdate之后被调用的方法。它通常用于处理一些需要在所有更新(包括物理更新和动画更新)之后进行的逻辑。由于它在游戏循环的后期阶段被调用,因此它通常用于处理与渲染直接相关的任务,如相机调整、UI更新等。突然占用大量时间的问题可能由多种原因引起,包括复杂的逻辑处理、频繁的资源加载、不恰当的渲染优化、插件或第三方库的副作用以及内存泄漏或垃圾回收等。为了解决这个问题,开发者需要仔细审查和优化中的代码,同时利用Unity提供的工具来监控和分析游戏性能。

Yori_22的博客 979

设计模式——C++11实现单例模式(饿汉模式、懒汉模式),与单例的进程

C++11:线程不安全、多次加锁、单次加锁、不加锁实现单例模式。介绍饿汉模式和懒汉模式。最后实现一个单例的进程

chfens的博客 1846

SAP PP CSAP_MAT_BOM_MAINTAIN ECN 增加组件

SAP PP CSAP_MAT_BOM_MAINTAIN ECN 增加组件。

GAVIN 409

封包(一)(雷电模拟器+ProxyDroid+查尔斯3.93+WPE)

自从换了工作就没有给大家分享一些干活,在加上陪伴自己的孩子没有时间更新文章了,这只能在晚上给大家写文档了,我最近在游戏公司上班,研究封包。我把这些东西都做成了笔记,我想有些东西是大家都想弄明白d ...

寒梅独自开 1万+

设计模式(一):c++11单例模式

懒汉式 单例模式是一种设计模式,其目的是保证程序中某个类只能存在一个实例,通常日志系统和程序中的管理类(比如用于管理回调函数的handle_manager等)会以单例模式实现,显然程序不希望这些数据结构存在多个。 c++单例模式有很多种写法,但c++11之后的单例模式,拒绝花里胡哨,直接上代码: #include <iostream> class singleton{ public: static singleton getInstance(){ static sing

csy777777的博客 469

NSGA-Ⅱ算法:从原理到实战,解锁多目标优化难题

本文深入解析NSGA-Ⅱ算法在多目标优化中的应用,从原理到实战全面覆盖。通过快速非支配排序、精英策略和拥挤度比较三大创新,NSGA-Ⅱ有效解决了传统算法的效率与多样性问题。结合工业案例展示其在注塑工艺优化中的显著效果,为工程师提供实用解决方案。

weixin_29207149的博客 366

C++11改进单例模式

我们在写单例模式的时候会遇到一个问题,就是多种类型的单例可能需要创建多个类型的单例,主要是因为创建单例对象的构造函数无法统一,各种类型的形参不尽相同,导致我们不容易做一个所有类型都通过的单例。现在C++11帮助我们解决了这个问题,解决这个问题的关键靠的是C++11的可变模板参数,下面看代码。template &lt;typename T&gt; class Singleton { public: ...

隔壁家的猫先生 907

SAP 物料账前期没有运行的解决方法

If you use the actual costing (material ledger), you must have completely closed all period-end closing operations in the actual costing for the penultimate period prior to the period shift. Use the '...

含笑饮砒霜死后更嚣张 3316

数字信号处理----数字上变频和下变频都FPGA实现

** 数字信号处理基础----信号下变频和解调 一、 任务介绍 数字上变频器(DUC)和数字下变频器(DDC)广泛应用于通信系统,用于信号采样速率的转换。当信号从基带转换至中频( IF )带,需要使用数字上变频器。而数字下变频器是用于将信号从中频( IF )带转换为基带。DUC和DDC通常包括使用混频器进行频率转换,此外还有采样率转换。DUC或DDC的结构主要取决于所需要的转换率。例如,WiMAX (全球互通微波接入)系统典型的转换率为8—10阶。对于如此低的转换率,DUC和DDC只需采用FIR滤波器架构。

Born_toward的博客 3万+

c++11下的单例模式

一、原来的单例模式设计流程 1、构造函数修改为私有; 2、定义一个私有的静态成员变量(返回指针); 3、定义一个全局的静态成员函数(返回指针); 4、通过全局静态成员函数实现控制类的实例化的唯一性。 二话不说上代码,以前代码: #include <pthread.h>//pthread.h是在linux编程环境下才使用 using namespace std; class Singleton { private...

zuiyijiangnan的博客 1389

【SigmaStudio】自定义算法组件之源码规范(二)

工作中自定义算法组件一般是dll文件,生成dll文件需要XML文件和DLB文件,记录一下DLB文件代码的编码规范,定义SigmaStudio SHARC算法开发的编码规则,涵盖函数原型、内存管理、接口结构体等关键要求,确保算法模块与SigmaStudio环境兼容

liang_song的博客 1377

C++ 设计模式(二)——单例模式

设计模式(二)单例模式

一个程序猿的工作知识深化日常 820

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++设计模式[二]单例模式

接着就是单例模式;个人理解就是把创建方法改为私有,然后再内部实例化,禁止外部创建对象。 何为单例模式,在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个访问它的全局访问点。首先,需要保证一个类只有一个实例;在类中,要构造一个实例,就必须调用类的构造函数,如此,为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为protecte

深藏功与名 1996

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式(C++实现)(二)——单例模式

示例问题: 一个程序中,有一个管理类,这个管理类,只想实例化一个对象,且要保证这个类只有一个实例化对象。 分析: 全局变量不能解决该问题,全局变量不能防止一个类实例化多个对象。 解决方案: Singleton.h 单例类的实现 该类的构造函数和析构函数声明为私有的(为了防止除了提供该类的全局访问点外的其他方法创建该类的对象) 该单例模式的实现,是利用static关键字的特性。即st...

huashuolin001的博客 500

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++设计模式(二)单例模式

参考C++设计模式这本书,写了一个示例,如下: #include #include #include #include using namespace std; /* 单例 */ class Singleton { private: static Singleton* m_pInstance; int m_data; protected: Singleton

不忘初心的专栏 517

c++ 设计模式 (二) - 单例模式

文章目录单例模式实现方法一、饿汉模式二、懒汉模式三、懒汉模式,使用互斥锁解决多线程问题四、懒汉模式,使用双重检测互斥锁五、内部类方式 单例模式实现方法 通过单例模式保证系统中一个类只有一个实例,实现方法: 设置构造函数,拷贝构造函数,赋值运算符函数均为私有函数 定义一个该类的静态私有对象 定义一个静态公有函数,用于创建和获取其静态私有对象 一、饿汉模式 饿了就立刻想到吃,类比到创建对象也是如此,当类一初始化,该对象就立刻会被实例化 #include <stdio.h> #include &

chenwh_cn的博客 395

C++设计模式(二)——单例模式

适用环境: 一个类只允许有一个实例(比如写GUI程序时,有些窗口只能有一个) 提供一个公共访问点 特点: 私有化构造函数 将类的实例构造放在类内部 提供对唯一实例的受控访问 饿汉式单例: 在加载类的时候直接构造实例,缺点:提前构造占用空间 class Eag...

ItaLink 228

我与C++设计模式(二)——单例模式

单例模式应该是我接触设计模式时最早学会的一个设计模式,它比较简单易懂,目的就一个,设计出能只能创建一个对象的类。 上代码: singleton.h //singleton.h #ifndef _SINGLETON_H__ #define _SINGLETON_H__ #include class singleton { private:

guozhengdong的专栏 559

c++ 设计模式 (二) - 单例模式

https://blog.youkuaiyun.com/chenwh_cn/article/details/116483408为帮助您在优快云创作的文章获得更多曝光和关注,我们为您提供了专属福利: 已注册且未在优快云平台发布过文章的用户,9月1日—9月30日期间发布首篇文章可享大额首篇流量券扶持,且发布首篇文章后30日内,享连续每日流量券扶持; 已注册且未在优快云平台发布过文章的用户,在8月1日—8月30日期间发布过首篇,可自9月1日起,享连续30天每日流量券扶持;更多福利介绍详见https://mp.csdn.

可爱的小黑土土博客 139

C++设计模式——单例模式 (二)

单例的模板

Mr.Sugarcane 246

两种语言实现设计模式(C++和Java)(二:单例模式)

本篇介绍单例模式,可以说是使用场景最频繁的设计模式了。可以根据实例的生成时间,分为饿汉模式和懒汉模式 饿汉模式:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。 懒汉模式:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化 一.饿汉模式 1.c++ 线程安全,不会内存泄漏的写法: 1 class Singleton 2...

aozhimen9773的博客 183

设计模式的 C++ 实现---单例模式(二)

前文回顾 单例模式(一) 前言 上篇文章记录了 C++ 中限制一个类只生成一个实例的方法,本文在此基础上进行扩展:限制某个类最多只能有 n 个实例对象。 限制类对象个数 实现说明 ①.对象创建会调用构造函数,对象销毁会调用析构函数,因此可以在构造和析构函数中进行数量的记录。 ②.使用静态成员变量记录类的实例数量。 ③.构造函数定义为 private,然后提供另外的构造函数用于创建对象。 代码示例 class Anyleton { public: class TooManyObj{};//异常

编程猿来如此 269

以C/C++语法浅谈二十三种设计模式(二)——单例模式(Singleton)

单例模式

尘海折柳的博客 1007

C++设计模式(二)单例模式、代理模式、外观模式、模板方法模式

C++设计模式之依赖倒转原则(面向依赖编程) C++设计模式之单例模式 有某些场景需要保证类只能有一个对象,那如何实现单例模式? 大概需要如下三个步骤 1、私有化构造函数 2、private& static 静态数据: 指向对象的指针 3、提供public访问权限的方法返回指向唯一对象的指针 (该方法一定是static方法,因为构造函数是private私有的) class SingleInstance { public: //提供静态接口 static SingleInstance* getIn

weixin_45312249的博客 381
上一篇: C++ 设计模式(一)
下一篇: C++设计模式之工厂模式(三)
一杯盐水
博客等级 码龄10年 62粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值