我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++单例模式实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++单例模式实例分析

本篇内容介绍了“C++单例模式实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

不能被拷贝的类

拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。

C++98

将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。

class CopyBan{//...private:CopyBan(const CopyBan&);CopyBan& operator=(const CopyBan&);//...};

原因:

设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,就可以不能禁止拷贝了

只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单,而且如果定义了就不会防止成员函数内部拷贝了。

C++11

C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。

class CopyBan{//...CopyBan(const CopyBan&) = delete;CopyBan& operator = (const CopyBan&) = delete;//...};

只能在堆上创建对象的类

实现方式:

将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。

提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建

class HeapOnly{public://提供一个static公有函数创建对象,对象创建的都在堆上static HeapOnly* CreateObject(){return new HeapOnly;}private:HeapOnly(){}//C++98 防拷贝 只声明,不实现HeapOnly(const HeapOnly&);//C++11HeapOnly(const HeapOnly&) = delete;};

只能在栈上创建对象的类

方法一:同上将构造函数私有化,然后设计静态方法创建对象返回即可。

class StackOnly{public:StackOnly(){}public://C++11void* operator new(size_t size) = delete;void operator delete(void* p) = delete;private://C++98 防调用void* operator new(size_t size);void operator delete(void* p);};

屏蔽new

因为new在底层调用void* operator new(size_t size)函数,只需将该函数屏蔽掉即可。注意:也要防止定位new

class StackOnly{public:StackOnly(){}private:void* operator new(size_t size);void operator delete(void* p);};

不能被继承的类

C++98

//C++98这种方式不够直接//这里是可以继承的,但是Derive不能创建对象,因为Derive的构造函数必须要调用父类NonOnherit构造,但是NonInherit的构造函数私有了,私有在子类不可见,那么这里继承不会报错,继承的子类创建对象会报错class NonInherit{public:static NonInherit GetInstance(){return NonInherit();}private:NonInherit(){}};

C++11

final关键字,final修饰类,表示该类不能被继承。

class A final{//...};

只能创建一个对象的类(单例模式)

设计模式

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。

使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

单例模式

定义一个全局对象,大家都能用,也能保证单例,但这种方式存在很大的缺陷,你要让大家都能用,这个对象就只能定义在一个.h,如果这个.h在多个.cpp包含,那么链接会报错。全局静态,只在当前文件可见,不再是同一个对象,每个xxx.cpp中各自是一个对象。 extern可以使链接不报错,但不能保证全局只有唯一一个v,可能某个地方又重新定义了一个变量v 所以我们可以在.h中声明,在.cpp中定义,声明和定义分离。否则在.h中定义,多个cpp包含就会有多份。

某些类, 只应该具有一个对象(实例), 就称之为单例.

在很多服务器开发场景中, 经常需要让服务器加载很多的数据 (上百G) 到内存中. 此时往往要用一个单例的类来管理这些数据

单例模式有两种实现模式:饿汉实现方式和懒汉实现方式

[洗碗的例子]: 吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭. 吃完饭, 先把碗放下, 然后下一顿饭用到这个碗了再洗碗, 就是懒汉方式. 懒汉方式最核心的思想是 “延时加载”. 从而能够优化服务器的启动速度.

饿汉模式

在main函数之前,一开始就创建对象

.h:

//饿汉模式:main函数之前,一开始就创建对象//全局只要唯一的Singleton实例对象,那么他里面的成员也就是单例的class Singleton{public://3.提供一个获取单例对象的static成员函数static Singleton& GetInstance();//如果vector对象是私有,想访问,只能再封装一层//void PushBack(int x)//{//_v.push_back(x);//}vector<int> _v;private://vector<int> _v;//1.构造函数私有化,不能随意创建对象Singleton(){}//防拷贝Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;//2.类里面声明一个static Singleton对象,在cpp定义这个对象//保证全局只要一个唯一对象//这里的static类比的是全局变量,只是受类域的限制,没有改变链接属性static Singleton _sinst;};

.cpp:

#include "Singleton.h"//定义Singleton Singleton::_sinst;Singleton& Singleton::GetInstance(){return _sinst;}

优点:简单

缺点:main函数之前创建初始化的。如果单例对象的构造函数中要做很多工作,可能会导致进程启动慢。

且如果有多个单例类对象实例启动顺序不确定。

C++单例模式实例分析

如果这个单例对象在多线程高并发环境下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞争,提高响应速度更好。

懒汉模式

饿汉式在应用启动时就创建了 实例,饿汉式是线程安全的,是绝对单例的。懒汉式在对外提供的获取方法被调用时会实例化对象。在多线程情况下,懒汉模式不是线程安全的。

第一次使用实例对象时,创建对象。进程启动无负载。多个单例实例启动顺序自由控制。

//定义Singleton* Singleton::_spinst = nullptr;mutex Singleton::_mtx;Singleton& Singleton::GetInstance(){//双检查加锁 提高效率if (_spinst == nullptr){_mtx.lock();if (_spinst == nullptr){//第一次调用_spinst = new Singleton;}_mtx.unlock();}return *_spinst;}void Singleton::DelInstance(){if (_spinst != nullptr){_mtx.lock();if (_spinst != nullptr){delete _spinst;_spinst = nullptr;}_mtx.unlock();}}

C++单例模式实例分析

#pragma once#include <vector>#include <iostream>#include <mutex>using namespace std;//懒汉模式:第一次调用GetInstance时,才会创建初始化单例对象//相对于饿汉,不存在可能会导致启动慢的问题,也可以控制顺序依赖的问题了class Singleton{public://3.提供一个获取单例对象的static成员函数static Singleton& GetInstance();//如果vector对象是私有,想访问,只能再封装一层//void PushBack(int x)//{//_v.push_back(x);//}vector<int> _v;//或实现一个内嵌垃圾回收类class CGarbo {public:~CGarbo() {if (Singleton::_spinst)delete Singleton::_spinst;}};//定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数从而释放单例对象static CGarbo Garbo;private://vector<int> _v;//1.构造函数私有化,不能随意创建对象Singleton(){}//防拷贝Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;//2.类里面声明一个static Singleton对象,在cpp定义这个对象//保证全局只要一个唯一对象static Singleton* _spinst;static mutex _mtx;};

“C++单例模式实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++单例模式实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++单例模式实例分析

本篇内容介绍了“C++单例模式实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不能被拷贝的类拷贝只会放生在两个场景中:拷贝构造函数以及
2023-06-29

C#单例模式的示例分析

这篇文章给大家分享的是有关C#单例模式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。单例模式也是创建型模式的一种,也是23种设计模式中比较简单的一种。见名思意,在整个软件系统中,只有某个类型的一个对象,
2023-06-29

JAVA的单例模式实例分析

这篇文章主要介绍“JAVA的单例模式实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JAVA的单例模式实例分析”文章能帮助大家解决问题。一、单例模式是什么?单例(Singleton)模式的定义
2023-06-29

用实例分析Java单例模式

这篇文章主要用实例分析Java单例模式,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。本文实例讲述了Java单例模式。分享给大家供大家参考,具体如下:在实际开发的时候会有一些需求,在某个类中只能
2023-05-31

Java设计模式的单例模式实例分析

本文小编为大家详细介绍“Java设计模式的单例模式实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式的单例模式实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是单例模式单例模式(S
2023-06-29

Java中的单例模式实例分析

本篇内容介绍了“Java中的单例模式实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、定义单例模式(Singleton Patter
2023-06-29

java单例模式的示例分析

这篇文章主要介绍了java单例模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。定义: 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个
2023-05-30

PHP中单例模式的示例分析

这篇文章将为大家详细讲解有关PHP中单例模式的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、什么是单例模式?1、含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例
2023-06-20

分析Java中的单例模式

本篇内容主要讲解“分析Java中的单例模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析Java中的单例模式”吧!WHAT维基百科给出了解释、实现的思路以及应该注意的地方:单例模式,也叫单子
2023-06-25

C#单例模式引起的自定义异常举例分析

本篇内容主要讲解“C#单例模式引起的自定义异常举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#单例模式引起的自定义异常举例分析”吧!案例代码对于单例模式,C#有个简洁的实现,采用静态的
2023-06-17

C++怎么实现单例模式

本篇内容介绍了“C++怎么实现单例模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!多线程环境下的单例模式Instance方法是这样实现的:
2023-06-19

JAVA 枚举单例模式及源码分析的实例详解

JAVA 枚举单例模式及源码分析的实例详解 单例模式的实现有很多种,网上也分析了如今实现单利模式最好用枚举,好处不外乎三点:1.线程安全2.不会因为序列化而产生新实例3.防止反射攻击但是貌似没有一篇文章解释ENUM单例如何实现了上
2023-05-31

C#策略模式的示例分析

小编给大家分享一下C#策略模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!策略模式所谓策略其实就是做一件事情有很多很多的方法,比如说一个商场要搞促销,
2023-06-29

C++模板使用实例分析

这篇文章主要介绍了C++模板使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++模板使用实例分析文章都会有所收获,下面我们一起来看看吧。非类型模板参数模板参数分类类型形参与非类型形参。类型形参:出现
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录