【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译)

简介: 什么是 Single Instance 单例模式?单例模式是计算机程序设计当中一种常用思路,即软件系统运行当中,该类只允许拥有一个实例,且它必须在初始化的时候自己创建自己的实例。

什么是  Single Instance 单例模式?

单例模式是计算机程序设计当中一种常用思路,即软件系统运行当中,该类只允许拥有一个实例,且它必须在初始化的时候自己创建自己的实例。

 

那么单例模式主要是什么用途呢?

优化访问性能,便于进行数据共享。

 

比如说:

1,软件系统运行当中,业务上的配置文件参数共享。

2,多线程之间数据的共享。

3,调用类似于数据库操作这种需要频繁访问的对象时,减少 Object 的频繁创建销毁和函数调用的栈内存消耗。

4,数据需要临时保存时,给其他对象提供一个统一化的数据接口。

5,提升高度复用情况下的访问性能。

 

那么单例模式的具体实现方式是?

创建一个类,这个类会自己创建自己在内存当中的实例,实例可以被其他类访问,同时不允许以任何方式再次创建这个类的实例。

 

其中有什么原则?

1,必须保证在整个软件系统运行的生命周期当中,实例仅有一个,不能被再次创建,也不能被拷贝、赋值。

2,必须保证内存的安全性问题。

3,必须保证线程的安全性问题。

4,必须保证实例仅能通过指定的接口获得。

 

那么具体有什么细节?

1,可以通过将 构造、拷贝构造、赋值运算符重载 声明为 Private 以保证实例不会被再次创建。

2,可以通过智能指针进行包装,以保证内存的安全性。

3,可以通过使用 Static 关键字保证实例指针常驻于内存全局变量区。

4,可以使用 std::call_once 来保证类的实例只会创建一次,并且不会有线程安全问题。

 

单例模式分为主动模式和被动模式,区别是:

主动模式在类加载时就已经创建好了自己的实例。

被动模式在被第一次调用时才会创建自己的实例。

 

 

这里演示的是被动模式:

================== 创建一个叫大脑工具箱的“工类” ==================

----------------- 头文件 -----------------

#pragma once#include <memory>usingstd::shared_ptr;
usingstd::make_shared;
#include <mutex>usingstd::call_once;
usingstd::once_flag;
// 创建一个叫大脑工具箱的单例类classBrainToolBox{
public:
// 获取单例的函数staticshared_ptr<BrainToolBox>GetInstance();
public:
// 供调用的测试函数voidHelloByte();
private:
// Private 锁死构造和析构BrainToolBox();
~BrainToolBox();
// Private 锁死拷贝构造BrainToolBox(constBrainToolBox&) {};
// Private 锁死赋值运算符BrainToolBox&operator=(constBrainToolBox&) {};
private:
// 单例的指针声明staticshared_ptr<BrainToolBox>BrainInstance;
// Onec Flag 声明staticonce_flagBrainOnceFlag;
};

 

----------------- CPP文件 -----------------

#include <iostream>#include "BrainToolBox.h"// 单例的指针定义shared_ptr<BrainToolBox>BrainToolBox::BrainInstance;
// OnceFlag 定义once_flagBrainToolBox::BrainOnceFlag;
// 获取单例 如果不存在则创建且只创建一次shared_ptr<BrainToolBox>BrainToolBox::GetInstance()
{
call_once(BrainToolBox::BrainOnceFlag, [&] {
structmake_shared_enabler : BrainToolBox{};
BrainToolBox::BrainInstance=make_shared<make_shared_enabler>();
    });
returnBrainToolBox::BrainInstance;
}
// 测试输出一段字符串以确定单例类被成功创建voidBrainToolBox::HelloByte()
{
std::cout<<"Hello Byte!"<<std::endl;
return;
}
// 构造BrainToolBox::BrainToolBox()
{
}
// 析构BrainToolBox::~BrainToolBox()
{
}

 

================== 测试一下 ==================

#include "BrainToolBox.h"intmain()
{
shared_ptr<BrainToolBox>tool=BrainToolBox::GetInstance();
tool->HelloByte();
}

会打印 Hello Byte 字符串。






====================================

芯片烤电池 C++ Example 2022-Spring Season Pass :

【Example】C++ 标准库常用容器全面概述

【Example】C++ 回调函数及 std::function 与 std::bind

【Example】C++ 运算符重载

【Example】C++ 标准库智能指针 unique_ptr 与 shared_ptr

【Example】C++ 接口(抽象类)概念讲解及例子演示

【Example】C++ 虚基类与虚继承 (菱形继承问题)

【Example】C++ Template (模板)概念讲解及编译避坑

【Example】C++ 标准库 std::thread 与 std::mutex

【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise)

【Example】C++ 标准库 std::condition_variable

【Example】C++ 用于编译时封装的 Pimpl 演示 (编译防火墙 Private-IMPL)

【Example】C++ 单例模式 演示代码 (被动模式、兼容VS2022编译)

====================================

相关文章
|
2月前
|
C++ Windows
应用程序无法正常启动(0xc0000005)?C++报错0xC0000005如何解决?使命召唤17频频出现闪退,错误代码0xC0000005(0x0)
简介: 本文介绍了Windows应用程序出现错误代码0xc0000005的解决方法,该错误多由C++运行库配置不一致或内存访问越界引起。提供包括统一运行库配置、调试排查及安装Visual C++运行库等解决方案,并附有修复工具下载链接。
1056 1
|
9月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
4月前
|
API 数据安全/隐私保护 C++
永久修改机器码工具, exe一机一码破解工具,软件机器码一键修改工具【c++代码】
程序实现了完整的机器码修改功能,包含进程查找、内存扫描、模式匹配和修改操作。代码使用
|
5月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
186 0
|
5月前
|
C++
爱心代码 C++
这段C++代码使用EasyX图形库生成动态爱心图案。程序通过数学公式绘制爱心形状,并以帧动画形式呈现渐变效果。运行时需安装EasyX库,教程链接:http://【EasyX图形库的安装和使用】https://www.bilibili.com/video/BV1Xv4y1p7z1。代码中定义了屏幕尺寸、颜色数组等参数,利用随机数与数学函数生成动态点位,模拟爱心扩散与收缩动画,最终实现流畅的视觉效果。
808 0
|
8月前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
163 16
|
10月前
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
189 25
为什么C/C++编译腰要先完成汇编
|
12月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
259 4
|
9月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。