当前位置: 首页 > news >正文

【C++ 23种设计模式】

C++ 23种设计模式

  • ■ 创建型模式(5种)
    • ■ 工厂模式
    • ■ 抽象工厂模式
    • ■ 原型模式
    • ■ 单例模式
      • ■ 第一种:单线程(懒汉)
      • ■ 第二种:多线程(互斥量实现锁+懒汉)
      • ■ 第三种:多线程(const static+饿汉)(还要继续了解)
    • ■ 建造者模式
  • ■ 结构型模式(7种)
    • ■ 适配器模式
    • ■ 桥接模式
    • ■ 组合实体模式
    • ■ 装饰器模式
    • ■ 外观模式
    • ■ 享元模式
    • ■ 代理模式
  • ■ 行为型模式(11种)
    • ■ 责任链模式
    • ■ 中介者模式
    • ■ 策略模式
    • ■ 模板模式
    • ■ 状态模式
    • ■ 观察者模式
    • ■ 备忘录模式
    • ■ 命令模式
    • ■ 访问者模式
    • ■ 解释器模式
    • ■ 迭代器模式

■ 创建型模式(5种)

■ 工厂模式

示例一:

#include<iostream>
#include<string>
using namespace std;
enum CTYPE{COREA,COREB};
//定义一个基类单核
class SingleCore 
{
public:virtual void show() = 0;
};
//单核A
class SingleCoreA:public SingleCore
{
public:void show() {cout << "SingleCore A" << endl;}
};
//单核B
class SingleCoreB:public SingleCore
{
public:void show() {cout << "SingleCore B" << endl;}
};
//唯一的工厂,可以生成A、B两种处理器核,在内部判断
class Factory {
public://基类的对象指针指向子类的对象,也就是多态SingleCore* CreateSingleCore(CTYPE ctype){//工厂内部判断if (ctype == COREA){//生产核Areturn new SingleCoreA();}else if (ctype == COREB){//生产核Breturn new SingleCoreB();}else {return NULL;}}
};
int main() 
{Factory* factor = new Factory();factor->CreateSingleCore(COREA)->show();getchar();return 0;
}

■ 抽象工厂模式

■ 原型模式

■ 单例模式

■ 第一种:单线程(懒汉)

//单线程解法
//这种解法在多线程的情况下,可能创建多个实例。
class Singleton1
{
private:static Singleton1* m_pInstance1;//需要的时候才创建,懒汉//利用static关键字的特性,不属于任何类,整个类只有一个Singleton1();
public:static Singleton1* GetInstance1();static void DestroyInstance1();
};
Singleton1::Singleton1()
{cout << "创建单例" << endl;
}
Singleton1* Singleton1::GetInstance1()
{return m_pInstance1;
}
void Singleton1::DestroyInstance1()
{if (m_pInstance1 != nullptr){delete m_pInstance1;m_pInstance1 = nullptr;}
}//初始化一个对象
Singleton1* Singleton1::m_pInstance1 = new Singleton1();//单线程下多次获取实例
void test1()
{Singleton1* singletoObj1 = Singleton1::GetInstance1();cout << singletoObj1 << endl;Singleton1* singletoObj2 = Singleton1::GetInstance1();cout << singletoObj2 << endl;//上面的两个对象会指向同一个地址Singleton1::DestroyInstance1();
}

■ 第二种:多线程(互斥量实现锁+懒汉)

//多线程+加锁(互斥量)
class Singleton2
{
private:Singleton2();static Singleton2* m_pInstance2;static mutex m_mutex;//互斥量
public:static Singleton2* GetInstance2();static void DestroyInstance2();
};Singleton2::Singleton2()
{cout << "创建单例2" << endl;
}
Singleton2* Singleton2::GetInstance2()
{if (m_pInstance2 == nullptr){cout << "加锁中" << endl;m_mutex.lock();if (m_pInstance2 == nullptr){m_pInstance2 = new Singleton2();}cout << "解锁中" << endl;m_mutex.unlock();}return m_pInstance2;
}
void Singleton2::DestroyInstance2()
{if (m_pInstance2 != nullptr){delete m_pInstance2;m_pInstance2 = nullptr;}
}
//静态成员变量的定义
Singleton2* Singleton2::m_pInstance2 = nullptr;//懒汉式的写法
mutex Singleton2::m_mutex;//常见一个实例对象,给下面的多线程调用
void print_singleton_instance()
{Singleton2* singletonObj2 = Singleton2::GetInstance2();cout << "新的一个实例对象" << singletonObj2 << endl;
}void test2()
{vector<thread> threads;for (int i = 0; i < 10; i++){//十个线程都指向同一个静态变量的地址threads.push_back(thread(print_singleton_instance));}for (auto& thr : threads){thr.join();}
}

■ 第三种:多线程(const static+饿汉)(还要继续了解)

//方案三:使用const特性,来替换方案二的加锁操作
class Singleton3
{
private:Singleton3(){}static const Singleton3* m_pInstance3;
public:static Singleton3* GetInstance3();static void DestroyInstance3();
};Singleton3* Singleton3::GetInstance3()
{//这个函数的返回值如果变化曾const static属性,就不用进行const_castreturn const_cast<Singleton3*> (m_pInstance3);
}void Singleton3::DestroyInstance3()
{if (m_pInstance3 != nullptr){delete m_pInstance3;m_pInstance3 = nullptr;}
}//静态成员变量的定义
const Singleton3* Singleton3::m_pInstance3 = new Singleton3();//饿汉式的写法//常见一个实例对象,给下面的多线程调用
void print_singleton_instance3()
{Singleton3* singletonObj3 = Singleton3::GetInstance3();cout << "新的一个实例对象" << singletonObj3 << endl;
}void test3()
{vector<thread> threads;for (int i = 0; i < 10; i++){//十个线程都指向同一个静态变量的地址threads.push_back(thread(print_singleton_instance3));}for (auto& thr : threads){thr.join();}
}

■ 建造者模式


■ 结构型模式(7种)

■ 适配器模式

■ 桥接模式

■ 组合实体模式

■ 装饰器模式

■ 外观模式

■ 享元模式

■ 代理模式


■ 行为型模式(11种)

■ 责任链模式

■ 中介者模式

■ 策略模式

■ 模板模式

■ 状态模式

■ 观察者模式

■ 备忘录模式

■ 命令模式

■ 访问者模式

■ 解释器模式

■ 迭代器模式

相关文章:

【C++ 23种设计模式】

C 23种设计模式 ■ 创建型模式(5种)■ 工厂模式■ 抽象工厂模式■ 原型模式■ 单例模式■ 第一种&#xff1a;单线程&#xff08;懒汉&#xff09;■ 第二种&#xff1a;多线程&#xff08;互斥量实现锁懒汉&#xff09;■ 第三种&#xff1a;多线程&#xff08;const static饿…...

亚信安慧AntDB:企业数据管理的明日之星

在信息科技飞速发展的时代&#xff0c;亚信科技AntDB团队提出了一项颠覆性的“超融合”理念&#xff0c;旨在满足企业日益增长的复杂混合负载和多样化数据类型的业务需求。这一创新性框架的核心思想在于融合多引擎和多能力&#xff0c;充分发挥分布式数据库引擎的架构优势&…...

Android Gradle开发与应用 (三) : Groovy语法概念与闭包

1. Groovy介绍 Groovy是一种基于Java平台的动态编程语言&#xff0c;与Java是完全兼容&#xff0c;除此之外有很多的语法糖来方便我们开发。Groovy代码能够直接运行在Java虚拟机&#xff08;JVM&#xff09;上&#xff0c;也可以被编译成Java字节码文件。 以下是Groovy的一些…...

Android 14 设置锁屏为NONE后开启双卡PIN锁,重启设备后,输完卡1的PIN码就进入了安卓界面,未提示输入卡2的PIN码

一.问题背景 目前在多个Android14平台发现开启双卡PIN码并且关闭屏幕锁的情况下,第二个PIN码锁输入弹框不能弹出问题,导致第二个卡不能注网。 如下是未修改前重启后解锁卡1PIN码的状态 可以看出卡2不能正常使用 二.何处关闭了卡2的PIN锁? 1.添加日志 首先在KeyguardSecu…...

2024 GoLand激活,分享几个GoLand激活的方案

文章目录 GoLand公司简介我这边使用GoLand的理由GoLand 最新变化GoLand 2023.3 最新变化AI Assistant 正式版GoLand 中的 AI Assistant&#xff1a;_Rename_&#xff08;重命名&#xff09;GoLand 中的 AI Assistant&#xff1a;_Write documentation_&#xff08;编写文档&…...

linux中对信号的认识

信号的概念与相关知识认识 信号是向目标进程发送消息通知的的一种机制。 信号可以以异步的方式发送给进程&#xff0c;也就是说&#xff0c;进程无需主动等待&#xff0c;而是在任何时间都可以接收到信号。 信号的种类 用kill-l命令查看系统定义的信号列表&#xff1a; 前台…...

【万题详解】P1048 [NOIP2005 普及组] 采药

题目描述 链接——题目在这里&#xff01;&#xff01;&#xff01; 辰辰是个天资聪颖的孩子&#xff0c;他的梦想是成为世界上最伟大的医师。为此&#xff0c;他想拜附近最有威望的医师为师。医师为了判断他的资质&#xff0c;给他出了一个难题。医师把他带到一个到处都是草…...

Golang基于Redis bitmap实现布隆过滤器(完结版)

Golang基于Redis bitmap实现布隆过滤器&#xff08;完结版&#xff09; 为了防止黑客恶意刷接口&#xff08;请求压根不存在的数据&#xff09;&#xff0c;目前通常有以下几种做法&#xff1a; 限制IP&#xff08;限流&#xff09;Redis缓存不存在的key布隆过滤器挡在Redis前 …...

Java基础-内部类

内部类 引言内部类的共性成员内部类静态内部类非静态内部类 局部内部类匿名内部类内部类的使用场景和好处 引言 Java不仅可以定义变量和方法,还可以定义类. 内部类允许你把一些逻辑相关的类组织在一起,并可以控制内部中类的可见性. 这么看来,内部类就像是代码一种隐藏机制:将类…...

设计模式-行为型模式-职责链模式

在软件系统运行时&#xff0c;对象并不是孤立存在的&#xff0c;它们可以通过相互通信协作完成某些功能&#xff0c;一个对象在运行时也将影响到其他对象的运行。行为型模式&#xff08;Behavioral Pattern&#xff09;关注系统中对象之间的交互&#xff0c;研究系统在运行时对…...

代码随想录算法训练营第四十天|LeetCode343 整数拆分、LeetCode96 不同的二叉搜索树

343.整数拆分 思路&#xff1a;确定dp数组以及下标的含义 dp[i]代表 i可以被拆分后的最大乘积。确定递推公式&#xff0c;假如拆成连个数&#xff0c;dp[i] j*(i-j),拆成两个数以上&#xff0c;dp[i]j*dp[i-j]&#xff0c;j的范围为1到i-1.dp[i]找到所有情况的最大值。初始化…...

接口自动化测试用例如何设计

说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀&#xff0c;甚至出现“ 做平台的 &…...

弱电综合布线:连接现代生活的纽带

在当今信息化快速发展的时代&#xff0c;弱电网络布线作为信息传输的重要基础设施&#xff0c;其作用日益凸显。它不仅保障了数据的高效流通&#xff0c;还确保了通信的稳定性。从商业大厦到教育机构&#xff0c;从政府机关到医院急救中心&#xff0c;再到我们居住的社区&#…...

Java零基础 - 数组的定义和声明

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…...

CSS补充(下),弹性布局(上)

高级选择器 1.兄弟选择器 2.同时满足 div.bg{background-color: red;}p.bg{background-color: green;}spam.bg{background-color: blue;}注&#xff1a;选择器中间没有空格&#xff0c;有明确标识的选择器写在后面 3.各种伪类的应用 3.1作为第几个子元素 选择器:nth-child…...

图数据库 之 Neo4j - 应用场景4 - 反洗钱(9)

原理 Neo4j图数据库可以用于构建和分析数据之间的关系。它使用节点和关系来表示数据,并提供实时查询能力。通过使用Neo4j,可以将大量的交易数据导入图数据库,并通过查询和分析图结构来发现洗钱行为中的模式和关联。 案例分析 假设有一家转账服务公司,有以下交易数据,每个…...

uboot分区介绍

RK平台的U-Boot支持两种分区表 RK paramter格式&#xff08;旧&#xff09;和 标准GPT格式&#xff08;新&#xff09;&#xff0c;当机器上同时存在 两种分区表时&#xff0c;优先使用GPT分区表。无论是 GPT 还是 RK parameter&#xff0c;烧写用的分区表文件都叫parameter.t…...

快速收集诊断信息,敏捷诊断工具obdiag应用实践——《OceanBase诊断系列》之三

1. 前言 作为OceanBase的敏捷诊断工具&#xff0c;obdiag具有以下特点&#xff1a; 部署便捷&#xff1a;提供rpm包和OBD上部署的模式&#xff0c;都能够一键部署安装。用户可以选择将其部署到集群中任意一台能连接到各个节点的设备上&#xff0c;而不仅限于OBServer节点。即…...

C++错误总结(1)

1.定义函数类型时&#xff0c;如果没有返回值&#xff0c;用void void swap(int &x, int &y){ int tem x; x y; y tem; } 2.输入时&#xff0c;不加换行符 cin >> a >> b >> c >> endl ;(红色标记的是错误的部分) 3.【逆序出入…...

std::shared_from_this注意事项:exception bad_weak_ptr

1.不可以在构造函数中调用shared_from_this() 因为它的实现是&#xff1a; _LIBCPP_INLINE_VISIBILITYshared_ptr<_Tp> shared_from_this(){return shared_ptr<_Tp>(__weak_this_);}也就是它依赖的__weak_this_此时还未创建完成。 2.一定要public继承 class MyTy…...

Malcolm核心组件深度解析:从PCAP处理到威胁检测

Malcolm核心组件深度解析&#xff1a;从PCAP处理到威胁检测 【免费下载链接】Malcolm Malcolm is a powerful, easily deployable network traffic analysis tool suite for full packet capture artifacts (PCAP files), Zeek logs and Suricata alerts. 项目地址: https://…...

搜索引擎倒排索引:TF-IDF与BM排序算法实现

搜索引擎倒排索引&#xff1a;TF-IDF与BM25排序算法解析 在信息爆炸的时代&#xff0c;搜索引擎如何从海量数据中快速返回相关结果&#xff1f;其核心依赖于倒排索引和排序算法。倒排索引通过记录词项与文档的映射关系提升检索效率&#xff0c;而TF-IDF和BM25则是两种经典的排…...

仅限头部云厂商解密的Java 25虚拟线程监控体系(Arthas+Micrometer+OpenTelemetry三合一埋点规范)

第一章&#xff1a;Java 25虚拟线程演进本质与云原生高并发新范式Java 25正式将虚拟线程&#xff08;Virtual Threads&#xff09;从预览特性转为标准特性&#xff0c;标志着JVM并发模型从操作系统线程绑定范式向轻量级、用户态调度范式的根本性跃迁。其本质并非简单“线程数量…...

记录一次长时间未提交事务造成的慢SQL

目录 问题描述 问题分析 1、了解前后信息 2、分析执行计划 3、分析生产环境系统负载 4、分析数据库性能 5、初步锁定根因为长时间未提交事务导致 6、最终根因定位 7、原理分析 问题描述&#xff1a; 开发反馈执行某条select语句的时候&#xff0c;生产环境和测试环境耗时相差非…...

Real-Anime-Z惊艳效果:不同肤色/人种/年龄在2.5D风格下的普适性表现

Real-Anime-Z惊艳效果&#xff1a;不同肤色/人种/年龄在2.5D风格下的普适性表现 1. 引言&#xff1a;探索2.5D风格的独特魅力 Real-Anime-Z是一款基于Stable Diffusion的写实向动漫风格大模型&#xff0c;它巧妙地在真实质感与动漫美感之间找到了平衡点。这种被称为"2.5…...

别再为BGA扇出挠头了!用Allegro的无盘设计,轻松搞定0.8mm间距芯片的走线

突破BGA布线极限&#xff1a;Allegro无盘设计实战指南 在当今高速PCB设计领域&#xff0c;BGA封装芯片的布线挑战日益严峻。当面对0.8mm甚至更小间距的BGA芯片时&#xff0c;传统布线方法往往捉襟见肘——差分对无法保持等长、电源通道拥挤不堪、过孔区域几乎无处下脚。这些困境…...

推送通知实现长连接与消息队列

推送通知在现代应用中扮演着至关重要的角色&#xff0c;无论是社交媒体的即时消息、电商平台的订单提醒&#xff0c;还是金融应用的交易通知&#xff0c;都离不开高效稳定的推送机制。而长连接与消息队列作为实现推送通知的两大核心技术&#xff0c;能够确保消息的实时性和可靠…...

数字IC面试必刷题:用Verilog实现序列检测器的两种经典方法(状态机 vs. 移位寄存器)

数字IC面试进阶指南&#xff1a;序列检测器的双方案深度对比与工程实践 在数字IC设计岗位的面试中&#xff0c;序列检测器几乎是必考题。面试官不仅期待候选人能实现基础功能&#xff0c;更希望看到对不同实现方案的深入理解和工程权衡。本文将聚焦状态机&#xff08;FSM&#…...

广州GEO优化多少钱?2026本地报价+真实行情,避开低价陷阱

对于广州做GEO优化&#xff08;生成式引擎优化&#xff09;的企业来说&#xff0c;最纠结的就是“花多少钱合适”“报价虚不虚”。结合2026年广州本地实测行情&#xff0c;不玩虚的&#xff0c;直接说真实报价&#xff1a;小型企业基础优化&#xff0c;季度大概6000-8000元&…...

2025届学术党必备的六大降AI率方案推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要想有效地把文本的AIGC检测率降下来&#xff0c;就得从词汇、句式以及逻辑结构这三个方面着…...