【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编译)

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

相关文章
|
17天前
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
46 25
为什么C/C++编译腰要先完成汇编
|
3月前
|
自然语言处理 编译器 Linux
|
3月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
81 4
|
3月前
|
自然语言处理 编译器 Linux
告别头文件,编译效率提升 42%!C++ Modules 实战解析 | 干货推荐
本文中,阿里云智能集团开发工程师李泽政以 Alinux 为操作环境,讲解模块相比传统头文件有哪些优势,并通过若干个例子,学习如何组织一个 C++ 模块工程并使用模块封装第三方库或是改造现有的项目。
|
4月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
248 22
|
4月前
|
C++
C++单例模式
C++中使用模板实现单例模式的方法,并通过一个具体的类A示例展示了如何创建和使用单例。
42 2
|
4月前
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
58 0
Linux c/c++之多文档编译
|
4月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
610 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
1月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
67 19
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
46 13