C++设计模式
单例模式
单例模式保证一个类只能创建一个对象,并提供全局访问点。通常用于全局共享例如日志、数据库连接池等。
Lazy Initialization
优点:需要时才初始化,节省空间
缺点:线程不安全
class Singleton{
private:static Singleton* instance;//提供的静态成员Singleton() {}//重写构造函数为私有,禁止使用通常方法创建Singleton
public://外界只能通过getInstance去获取静态成员,从而保证只有一个实例ststic Singleton* getInstance(){if(instance == nullptr)instance = new Singleton();//可能会有多个线程同时执行这句,导致问题return instance;}
}
Eager Initialization
优点:线程安全
缺点:不管用不用都会初始化,占空间
class Singleton{
private:static Singleton* instance;Singleton(){}
public:static Singleton* getInstance(){return instance;}
}Singleton* Singleton::instance = new Singleton();
Double-Checked Locking
优点:延迟加载、线程安全
缺点:没有
#include <mutex>class Singleton{
private:static volatile Singleton* instance;static std::mutex mtx;Singleton(){}
public:static volatile Singleton* getInstance(){if(instance == nullptr){std::lock_guard<std::mutex> lock(mtx);if(instance == nullptr){ //double-checked lockinginstance = new Singleton();}}return instance; }
};volatile Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mtx;
代理模式
我要租房,我不去租,找了个中介去租。
class Person{
public:virtual void rentHouse() = 0;//纯虚函数
};class I : public Person{
public:void rentHouse(){std::cout << "I want to rent a house."<<endl;}
};class Intermediary : public Person{
public: Intermediary(Person * person) : m_person(person) {}void rentHouse(){m_person->rentHouse();std::cout << "I'am Intermediary."<<endl;}
private:Person *m_person;
};void testDalegate()
{Person *i = new I();Person *intermediary = new Intermediary(i);intermediary->rentHouse();
}
简单工厂模式
简单工厂模式是一种实例化对象的方式,只要我们输入的实例化信息,就可以通过工厂方式实例化相应的实例化对象。
class TelPhone{
public:enum PhoneType{Mi, Oppo, Huawei};virtual void setName(std::string name) = 0;virtual void setPrice(double price) = 0;virtual double getPrice() = 0;
protected:std::string name;double price;
};class MiPhone : public TelPhone{
public: Miphone(){setname("mi15");setprice(1234)}std::string getName(){return TelPhone::name;}std::double getPrice(){return TelPhone::Price;}void setName(std::string name){TelPhone::name = name;}void setPrice(double price){TelPhone::price = price;}};
class OppoPhone : public TelPhone{//...
};
class HuaWeiPhone : public TelPhone{//...
};class TelPhoneFactory{
public://生产手机static TelPhone* productTelPhone(TelPhone::PhoneType phoneType){TelPhone *telp = nullptr;swith(phoneType){case TelPhone::Mi:telp = new Miphone();break;case TelPhone::Oppo:telp = new Oppophone();break;case TelPhone::Huawei:telp = new Huaweiphone();break;default:break;}return telp;}
};void testFactory(){TelPhone *telp = TelPhoneFactory::productTelPhone(TelPhone::Mi);if(telp != nullptr){std::cout<<telp->getName() << std::endl;std::cout<<telp->getPrice() << std::endl;}
}
观察者模式
又叫发布-订阅模式,定义对象间一对多的关系,当一个对象状态发生变化时,其所有依赖者都会收到通知
原型模式
用一个以及创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或者相似的对象。类似原件和复印件的关系。
策略模式
定义一系列算法,把他们一个个封装起来,并且使他们可以相互替换。通过策略模式,可以动态的选择、配置和切换算法,而无需修改客户端代码。
#include<iostream>enum StrategyType{E_StrategyNight,E_StraegyWeekend,
};
class Strategy{
public:virtual void algorithm() = 0;virtual ~Strategy(){}
};class StrategyNight : public Strategy{
public:void algorithm(){std::cout << "晚上加班计算方法"<<std::endl;}virtual ~StrategyNight(){}
};class StraegyWeekend : public Strategy{
public:void algorithm(){std::cout<<"周末加班"<<std::endl;}virtual ~StraegyWeekend(){}
};class Context{
public:Context(StrategyType strategyType){switch (strategyType){case E_StrategyNight:pStrategy = new StrategyNight();break;case E_StraegyWeekend:pStrategy = new StraegyWeekend();break;default:break;}}~Context(){if(pStrategy)delete pStrategy;}void overtimePay(){if(pStrategy){pStrategy->algorithm();}}
private:Strategy* pStrategy;
};int main(){Context *pcont = new Context(E_StraegyWeekend);pcont->overtimePay();if(pcont)delete pcont;return 0;
}
中介者模式
定义一个中介对象来封装一系列对象之间的交互,使得原有对象之间的耦合松散,且可以独立地改变他们之间的交互。

#include<iostream>
#include<vector>
#include<string>
using namespace std;class Employee{
private:string m_strName;string m_strContent;
public:Employee(string strName) : m_strName(strName){}void setName(string strName){m_strName = strName;}string getName(){return m_strName;}void setContent(string content){m_strContent = content;}string getContent(){if(m_strContent.empty())return "收到";return m_strContent;}virtual void talk() = 0;
};class Boss : public Employee{
public:Boss(string str) :Employee(str){}void talk(){cout << getName() << " says: " << getContent()<<endl;}
};class Manager : public Employee{
public:Manager(string str) :Employee(str){}void talk(){cout << getName() << " says: " << getContent()<<endl;}
};
class Securtity: public Employee{
public:Securtity(string str) :Employee(str){}void talk(){cout << getName() << " says: " << getContent()<<endl;}
};class Mediator{
protected:vector<Employee*> vec_emp;public:void addEmployee(Employee* emp){vec_emp.push_back(emp);}virtual void notify(Employee* emp) = 0;
};class HolidaysMediator : public Mediator{
public:void notify(Employee* emp){ emp->talk();for(int i = 0; i < vec_emp.size(); i++){if(emp != vec_emp[i]){vec_emp[i]->talk();}}}
};int main(){HolidaysMediator holidaysMediator;Boss* boss = new Boss("老板");Manager* manager = new Manager("经理");Securtity* securtity = new Securtity("保安");holidaysMediator.addEmployee(boss);holidaysMediator.addEmployee(manager);holidaysMediator.addEmployee(securtity);boss->setContent("明天放假");holidaysMediator.notify(boss);return 0;}
责任链模式
用来处理相关事务的一条执行链,执行链上有多个节点,每个节点都有机会处理请求事务,如果某个节点处理完就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。

#include<iostream>
using namespace std;class Logger{
public:enum LEVEL {DEBUG,INFO,WARN,ERROR };LEVEL m_level = LEVEL::DEBUG;Logger(){ }virtual ~Logger(){}void logMessage(LEVEL level, string message){if(m_level <= level){write(message);}if(m_nextLogger != NULL){m_nextLogger->logMessage(level, message);}}void setNextLogger(Logger* nextLogger){m_nextLogger = nextLogger;}
protected:virtual void write(string logger){};Logger* m_nextLogger;
};class DebugLogger : public Logger{
public:DebugLogger(LEVEL level){m_level = level;}void write(string logger){cout << "Debug Logger: " << m_level<< ", message:"<<logger<<endl;}
};
class ErrorLogger : public Logger{
public:ErrorLogger(LEVEL level){m_level = level;}void write(string logger){cout << "Error Logger: " << m_level<< ", message:"<<logger<<endl;}
};class InfoLogger : public Logger{
public:InfoLogger(LEVEL level){m_level = level;}void write(string logger){cout << "Info Logger: " << m_level<< ", message:"<<logger<<endl;}
};class WarnLogger : public Logger{
public:WarnLogger(LEVEL level){m_level = level;}void write(string logger){cout << "Warn Logger: " << m_level<< ", message:"<<logger<<endl;}
};class Client{
public:Client(){}~Client(){}void test(){Logger *logger = getChainOfLoggers();logger->logMessage(Logger::DEBUG, "this is debug");cout << "--------------"<<endl;logger->logMessage(Logger::DEBUG, "this is info");cout << "--------------"<<endl;logger->logMessage(Logger::DEBUG, "this is warn");cout << "--------------"<<endl;logger->logMessage(Logger::DEBUG, "this is error");}
private:Logger* getChainOfLoggers(){Logger *debug = new DebugLogger(Logger::DEBUG);Logger *info = new InfoLogger(Logger::INFO);Logger *warn = new WarnLogger(Logger::WARN);Logger *error = new ErrorLogger(Logger::ERROR);error->setNextLogger(warn);warn->setNextLogger(info);info->setNextLogger(debug);return error;}
};int main(){Client client;client.test();return 0;
}

相关文章:
C++设计模式
单例模式 单例模式保证一个类只能创建一个对象,并提供全局访问点。通常用于全局共享例如日志、数据库连接池等。 Lazy Initialization 优点:需要时才初始化,节省空间 缺点:线程不安全 class Singleton{ private:static Singlet…...
反向代购业务系统|无货源代购中国商品|反向海淘代购系统
什么是淘宝代购 淘宝代购是近年兴起的一种购物模式,是帮国外客户购买中国商品。主要是通过万邦科技的外贸代购模式,把淘宝、 天猫等电商平台的全站商品通过API接入到你的网站上,瞬间就可以架设一个有数亿产品的大型网上商城,而且…...
Linux 进程间通信
目录 管道 匿名管道(pipe) 有名管道(fifo) 小结 共享内存 消息队列 信号量 System V IPC的结构设计 Posix与System V的关系 管道 匿名管道(pipe) 我们知道,在Linux中通过fork创建的子…...
hippy 调试demo运行联调-mac环境准备篇
适用对于终端编译环境不熟悉的人看,仅mac端 hippy 调试文档官网地址 前提:请使用node16 联调预览效果图: 编译iOS Demo环境准备 未跑通,待补充 编译Android Demo环境准备 1、正常安装Android Studio 2、下载Android NDK&a…...
【golang】go module依赖的git tag被覆盖 如何处理 | 因测试产生大量的git tag 如何清除 最佳实践
一、场景 当我们把本地和远程git仓库的 tag全部删除,我们另外的项目依赖于这个被删除tag无法更新版本 如何处理? 如上图: 这里我创建了一个 v0.0.1 的tag,然后删除了这个tag,然后又创建了一个新的 v0.0.1的tag…...
Spring Cloud原理详解
Spring Cloud 是基于 Spring Boot 的微服务架构开发工具包,旨在帮助开发人员快速构建分布式系统中的一些常见模式,例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、领导选举、分布式会话和集群状态。Spring Cloud 是 Spring 生态系…...
力扣76. 最小覆盖子串(滑动窗口)
Problem: 76. 最小覆盖子串 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义两个map集合need和window(以字符作为键,对应字符出现的个数作为值),将子串t存入need中; 2.定义左右指针left、right均指向0ÿ…...
使用华为云云函数functiongraph
之前使用腾讯云serverless,但是突然开始收费了。所以改用functiongraph 首先登陆华为云。 目录 1.登录华为云 2.在控制台找到functiongraph并开通 3.添加依赖包: 3.1 制作依赖包 3.2引入依赖包 4.发送请求 4.1直接发送 4.1.1uri 4.1.2 请求头…...
Android logcat系统
一 .logcat命令介绍 android log系统: logcat介绍 : logcat是android中的一个命令行工具,可以用于得到程序的log信息. 二.C/Clogcat访问接口 Android系统中的C/C日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别: /…...
android 使用协程CoroutineScope 实现定时器
满足延迟执行、立即执行,每次任务间隔时长,总时长的任务 使用1 class TimeViewModel:Viewmodel(){//测试延迟5秒开始执行任务,然后每隔1秒执行1次,总执行时间60秒fun testTime(){var startTime System.currentTimeMillis()log(…...
【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:AcWing算法学习笔记 💬总结:希望你看完…...
UnityShader——09数学知识3
方阵 行与列数量相等的矩阵,n*n阶矩阵 对角矩阵 当对角线以外的矩阵内元素全为0,则称之为对角矩阵,对角矩阵的前提是必须是方阵 单位矩阵 对角线元素全为1,其余元素全为0,属于对角矩阵的一部分 矩阵和向量 把1 * n阶矩阵称…...
langchain学习笔记(九)
RunnableBranch: Dynamically route logic based on input | 🦜️🔗 Langchain 基于输入的动态路由逻辑,通过上一步的输出选择下一步操作,允许创建非确定性链。路由保证路由间的结构和连贯。 有以下两种方法执行路由 1、通过Ru…...
周处除三害在线资源最新电影1080p高清
打开下面这个链接就可以看到 周处除三害在线资源最新电影1080p高清 如果链接打不开,就复制下面的网址到浏览器打开 https://www.zhufaka.cn/liebiao/A09504AE3BF8BD06 用阿里云盘下载,下载完成之后,用迅雷播放 周处除三害在线资源最新电…...
STM32CubeIDE基础学习-新建STM32CubeIDE基础工程
STM32CubeIDE基础学习-新建STM32CubeIDE基础工程 前言 有开发过程序的朋友都清楚,后面开发是不需要再新建工程的,一般都是在初学时或者有特殊需要的时候才需要新建项目工程的。 后面开发都是可以在这种已有的工程上添加相关功能就行,只要前…...
R语言简介|你对R语言了解多少?
R语言是一种专门用于统计计算和图形展示的开源编程语言,它在数据科学领域有着广泛的应用。下面对R语言的环境、基础语法及注释进行解释: R语言环境 安装与配置 安装R语言通常可以从官方站点下载对应操作系统的安装包,如Windows、Linux、ma…...
Android的硬件接口HAL
我一直觉得,现代计算机不是一门科学,起码快算不上一门理科科学。上上下下全是人造,左左右右全是生意,用管理学,经济学去学计算机,也许更看得懂很多问题。HAL就是一个典型例子。 传统Linux绕开了微软的霸权…...
【js】数组的常用方法
增加 push,unshift,splice,concat 前面三种修改原数组,concat不会修改原数组push 从后面添加数据,并返回新数组的长度unshift 从前面添加数据,并返回新数组的长度splice 可以接受三个参数,第一个参数开始位置,第二个参数是删除元素的数量,第三个参数是插入的数据concat 合并数…...
08. Nginx进阶-Nginx动静分离
简介 什么是动静分离? 通过中间件将动态请求和静态请求进行分离。分离资源,减少不必要的请求消耗,减少请求延时。 动静分离的好处 动静分离以后,即使动态服务不可用,静态资源仍不受影响。 动静分离示意图 动静分离…...
RPC--一起学习吧之架构
RPC(远程过程调用)是一种网络通信协议,它允许一台计算机(客户端)上的程序调用另一台计算机(服务器)上的程序,就像调用本地程序一样。RPC 可以使得网络中的不同进程能够相互调用&…...
AI 模型推理框架对比 TensorRT vs ONNX
AI模型推理框架对比:TensorRT与ONNX的深度解析在人工智能技术飞速发展的今天,模型推理框架的选择直接影响着部署效率与性能表现。NVIDIA推出的TensorRT与微软主导的ONNX作为两大主流推理框架,各自拥有独特的优势与适用场景。本文将从多个维度…...
自媒体好帮手:OpenClaw+千问3.5-27B批量生成视频脚本
自媒体好帮手:OpenClaw千问3.5-27B批量生成视频脚本 1. 为什么需要自动化视频脚本生成 作为一个自媒体创作者,我每天最头疼的就是选题和脚本创作。传统流程需要手动搜索热点、分析数据、撰写大纲、拆解分镜,整个过程耗时耗力。直到我发现Op…...
【ProtoBuf 实战训练】网络版通讯录
文章目录1. 通讯录 4.0 实现(网络版)2. 环境搭建2.1 搭建服务端2.2 搭建客户端2.3 运行结果3. 新增联系人功能3.1 协议约定3.2 协议接口定义 (.proto)3.2.1 AddContactRequest(请求消息)3.2.2 AddContactResponse(响应…...
探索R语言中的数据处理:序列统计
在数据分析中,我们经常需要处理复杂的顺序数据,例如测试的时间序列。在本篇博客中,我们将探讨如何使用R语言来处理一个特定的问题:统计四种测试(Test 1到Test 4)在不同顺序下的执行频率。 问题描述 假设我们有一个研究数据框,其中包含四种测试的日期,这些测试可以以任…...
健康赛道又一个爆款玩法:华一拼团+公排返利,到底怎么做?
大家好,我一家电商软件开发公司的负责人。现在健康赛道那可真是遍地黄金,躺赚的机会说来就来啦!你是不是一直苦于找不到能落地、还能高盈利的模式系统?今天我就给大家分享2026爆火的模式——华一健康模式系统,它直接照…...
【OpenClaw企业级智能体实战】第23篇:个人知识库+自动化工作流——让OpenClaw成为你的第二大脑(附second-brain+Obsidian+飞书三合一完整方案)
摘要:长期深耕技术领域的从业者,普遍深陷信息过载困境:海量技术文档、论文、行业动态分散在书签、收藏夹、零散笔记中,传统工具仅能完成信息存储,无法实现语义关联、智能检索与自动迭代。本文基于OpenClaw原生second-brain插件,深度打通Obsidian本地知识图谱与飞书团队协…...
企业 Agent 流程上线后,如何实现持续优化与迭代?——2026年企业级智能体长效运营全景指南
进入2026年,企业级智能体(Enterprise AI Agent)已从早期的“实验性POC”全面转向“大规模生产部署”。然而,行业调研显示,超过60%的Agent流程在上线初期表现惊艳,却在运行3-6个月后因业务环境变化、知识库过…...
IT自动化运维平台建设解决方案:三阶段演进思路、平台架构与核心能力、关键功能模块、典型自动化场景与执行流程
该方案提出从人工运维向自动化、智能化演进,核心是通过统一平台整合Zabbix监控、脚本管理与工单系统,实现告警自动治愈与周期性任务自动化执行。方案采用分批推进策略,旨在提升效率、保障业务连续性并降低人为风险,最终落地智能化…...
LLM性能评估入门到精通,搞懂推理指标看这篇就够了!
TTFT、TPOT、ITL、Goodput… 这些指标到底什么意思?今天用一篇文章彻底讲清楚 LLM 推理的性能评估体系。 一、为什么指标很重要 生产环境的真实场景 你部署了一个大模型服务,用户反馈: “首字响应好慢” → 什么问题?“生成过程…...
基于深度学习的田间杂草检测系统(YOLOv12/v11/v8/v5模型)(源码+lw+部署文档+讲解等)
摘要田间杂草的生长不仅会影响作物的产量和质量,还会对农田管理造成巨大挑战。传统的杂草检测方法多依赖人工观察,效率低下且受主观因素影响。为了提高田间杂草的检测效率与准确性,本文提出了一种基于深度学习的田间杂草检测系统,…...
