C++设计模式总结

文章目录

      • 一、**创建型模式**(简化对象创建)
        • 1. **工厂模式**(Factory Pattern)
        • 2. **单例模式**(Singleton Pattern)
        • 3. **建造者模式**(Builder Pattern)
      • 二、**结构型模式**(处理对象组合关系)
        • 4. **适配器模式**(Adapter Pattern)
        • 5. **组合模式**(Composite Pattern)
        • 6. **代理模式**(Proxy Pattern - 如智能指针)
      • 三、**行为型模式**(对象间的通信与职责分配)
        • 7. **观察者模式**(Observer Pattern)
        • 8. **策略模式**(Strategy Pattern)
        • 9. **模板方法模式**(Template Method)
      • 四、**C++ 特有模式**
        • 10. **RAII 模式**(资源获取即初始化)
        • 11. **CRTP 模式**(Curiously Recurring Template Pattern)
        • 12. **PIMPL 惯用法**(减少头文件依赖)
      • 五、**性能优化模式**
        • 13. **对象池模式**(避免频繁创建销毁)
        • 14. **惰性初始化模式**(延迟加载)
      • **总结:何时选用哪些模式?**

C++ 中常用的设计模式与其独特语言特性(如手动内存管理、模板、运算符重载等)结合,可以简化复杂逻辑的代码实现,以下是 20 种核心设计模式(实际上不到20种) 及其典型 C++ 实现示例:


一、创建型模式(简化对象创建)

1. 工厂模式(Factory Pattern)
  • 作用:解耦对象的创建逻辑与使用逻辑
  • 代码示例
    class Shape {
    public:virtual ~Shape() = default;virtual void draw() = 0;
    };
    class Circle : public Shape { /*...*/ };
    class Square : public Shape { /*...*/ };class ShapeFactory {
    public:static Shape* createShape(const string& type) {if (type == "circle") return new Circle();else if (type == "square") return new Square();return nullptr;}
    };// 使用:
    Shape* obj = ShapeFactory::createShape("circle");
    obj->draw();
    
2. 单例模式(Singleton Pattern)
  • C++ 线程安全推荐实现
    class Singleton {
    private:static Singleton* instance;static mutex mtx;Singleton() {} // 私有化构造函数public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton* getInstance() {if (instance == nullptr) {lock_guard<mutex> lock(mtx); // 加锁if (instance == nullptr) {   // 双重检查锁定instance = new Singleton();}}return instance;}
    };// 初始化静态成员:
    Singleton* Singleton::instance = nullptr;
    mutex Singleton::mtx;
    
3. 建造者模式(Builder Pattern)
  • 适用场景:分步骤创建复杂对象(如 GUI 组件)
    class Pizza {
    public:void setDough(const string& dough) { /*...*/ }void setSauce(const string& sauce) { /*...*/ }
    };class PizzaBuilder {
    public:virtual ~PizzaBuilder() = default;virtual void buildDough() = 0;virtual void buildSauce() = 0;virtual Pizza* getPizza() = 0;
    };class Chef {
    private:PizzaBuilder* builder;
    public:void makePizza(PizzaBuilder* b) {builder = b;b->buildDough();b->buildSauce();}
    };
    

二、结构型模式(处理对象组合关系)

4. 适配器模式(Adapter Pattern)
  • 用途:转换接口以兼容旧代码
    class LegacyRectangle { // 旧接口: 通过坐标画矩形
    public:void draw(int x1, int y1, int x2, int y2) { /*...*/ }
    };class RectangleAdapter : public Shape {
    private:LegacyRectangle adaptee;
    public:void draw() override { adaptee.draw(0, 0, 100, 100); // 适配到新接口}
    };
    
5. 组合模式(Composite Pattern)
  • 树形结构示例
    class Component {
    public:virtual ~Component() = default;virtual void operation() = 0;virtual void add(Component* c) {} // 默认空实现
    };class Leaf : public Component {
    public:void operation() override { /*处理叶子节点*/ }
    };class Composite : public Component {
    private:vector<Component*> children;
    public:void operation() override {for (auto& child : children) {child->operation(); // 递归调用子节点}}void add(Component* c) override { children.push_back(c); }
    };
    
6. 代理模式(Proxy Pattern - 如智能指针)
  • 通过 RAII 管理资源
    template <typename T>
    class SmartPointer {
    private:T* raw_ptr;
    public:explicit SmartPointer(T* ptr) : raw_ptr(ptr) {}~SmartPointer() { delete raw_ptr; }T* operator->() { return raw_ptr; } // 代理指针运算符
    };// 使用:
    SmartPointer<MyClass> ptr(new MyClass());
    ptr->doSomething(); // 自动释放内存
    

三、行为型模式(对象间的通信与职责分配)

7. 观察者模式(Observer Pattern)
  • 基于 C++11 的现代化实现
    #include <functional>
    #include <vector>class Subject {
    private:vector<function<void(int)>> observers;
    public:void attach(const function<void(int)>& obs) {observers.push_back(obs);}void notify(int value) {for (auto& obs : observers) {obs(value); // 通知所有观察者}}
    };// 使用 lambda:
    Subject subject;
    subject.attach([](int val) { cout << "Observer1: " << val << endl; });
    subject.notify(42);
    
8. 策略模式(Strategy Pattern)
  • 结合模板与函数对象
    template <typename T>
    class SortStrategy {
    public:virtual void sort(vector<T>& data) = 0;
    };class QuickSort : public SortStrategy<int> {
    public:void sort(vector<int>& data) override { /*快速排序实现*/ }
    };class Context {
    private:SortStrategy<int>* strategy;
    public:void setStrategy(SortStrategy<int>* s) { strategy = s; }void execute(vector<int>& data) { strategy->sort(data); }
    };
    
9. 模板方法模式(Template Method)
  • 代码骨架延迟实现
    class DataProcessor {
    public:void process() {loadData();analyze();     // 子类实现差异点saveResult();}
    protected:virtual void analyze() = 0;void loadData() { /*通用加载逻辑*/ }void saveResult() { /*通用保存逻辑*/ }
    };class AudioProcessor : public DataProcessor {
    protected:void analyze() override { /*音频分析算法*/ }
    };
    

四、C++ 特有模式

10. RAII 模式(资源获取即初始化)
  • 核心思想:通过对象生命周期自动管理资源(内存、文件、锁)
    class FileWrapper {
    private:FILE* file;
    public:explicit FileWrapper(const char* filename) : file(fopen(filename, "r")) {}~FileWrapper() { if (file) fclose(file); }// 禁用拷贝(或实现移动语义)FileWrapper(const FileWrapper&) = delete;FileWrapper& operator=(const FileWrapper&) = delete;
    };// 使用:
    {FileWrapper file("data.txt"); // 文件自动关闭
    }
    
11. CRTP 模式(Curiously Recurring Template Pattern)
  • 静态多态优化性能
    template <typename Derived>
    class Base {
    public:void interface() {static_cast<Derived*>(this)->implementation();}
    };class Derived : public Base<Derived> {
    public:void implementation() { /*子类具体实现*/ }
    };// 调用:
    Derived d;
    d.interface(); // 调用Derived的实现,无虚函数开销
    
12. PIMPL 惯用法(减少头文件依赖)
  • 隐藏实现细节
    // Widget.h
    class Widget {
    public:Widget();~Widget();void doSomething();
    private:struct Impl;  // 前向声明unique_ptr<Impl> pImpl; // 实现细节隐藏
    };// Widget.cpp
    struct Widget::Impl {int internalData;void helperFunction() { /*私有函数实现*/ }
    };Widget::Widget() : pImpl(make_unique<Impl>()) {}
    Widget::~Widget() = default; // 需在cpp中定义(因unique_ptr删除不完整类型)
    

五、性能优化模式

13. 对象池模式(避免频繁创建销毁)
template <typename T>
class ObjectPool {
private:queue<unique_ptr<T>> pool;
public:T* acquire() {if (pool.empty()) {return new T();}auto obj = std::move(pool.front());pool.pop();return obj.release();}void release(T* obj) {pool.push(unique_ptr<T>(obj)); // 重用对象}
};
14. 惰性初始化模式(延迟加载)
class HeavyResource {
private:vector<BigData>* data = nullptr;
public:vector<BigData>& getData() {if (data == nullptr) {data = new vector<BigData>(/*加载大量数据*/);}return *data;}
};

总结:何时选用哪些模式?

场景推荐模式
需要隔离对象创建细节工厂模式、建造者模式
全局唯一访问点配置单例模式 (谨慎使用)
统一处理树形结构组合模式
动态增减对象功能装饰器模式
跨平台接口适配适配器模式、桥接模式
事件驱动系统观察者模式、发布-订阅模式
算法灵活替换策略模式、模板方法模式

设计模式的本质是 代码结构的经验总结,根据具体需求灵活选用,切勿过度设计!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30404.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

夏门大学DeepSeek 手册:从社会大众到高校及企业的全面应用实践研究(附 PDF 下载)

这 3 份手册分别从 DeepSeek 大模型概念、技术与应用实践、DeepSeek 大模型赋能高校教学和科研、DeepSeek 大模型及其企业应用实践-企业人员的大模型宝典几个角度进行全面分析&#xff0c;可以结合着清华、北大系列相互对照着学习。 清华北大推出的 DeepSeek 教程&#xff08;…

微服务保护:Sentinel

home | Sentinelhttps://sentinelguard.io/zh-cn/ 微服务保护的方案有很多&#xff0c;比如&#xff1a; 请求限流 线程隔离 服务熔断 服务故障最重要原因&#xff0c;就是并发太高&#xff01;解决了这个问题&#xff0c;就能避免大部分故障。当然&#xff0c;接口的并发…

工作学习笔记:HarmonyOS 核心术语速查表(v14 实战版)

作为在 HarmonyOS 开发一线摸爬滚打的工程师&#xff0c;笔者在 v14 版本迭代中整理了这份带血的实战术语表。 一、架构基础术语速查 A 系列术语 术语官方定义笔者解读&#xff08;v14 实战版&#xff09;开发陷阱 & 解决方案abc 文件ArkCompiler 生成的字节码文件打包时…

驾校与无人机飞手培训机构合作开展低空业务技术详解

驾校与无人机飞手培训机构合作开展低空业务是一个创新的举措&#xff0c;旨在结合双方的资源和专业优势&#xff0c;为学员提供多元化的技能培训和业务拓展机会。以下是对这种合作模式下低空业务技术的详细解析&#xff1a; 一、合作背景与意义 1. 市场需求增长&#xff1a;随…

黄昏时间户外街拍人像Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 黄昏时分有着独特而迷人的光线&#xff0c;使此时拍摄的人像自带一种浪漫、朦胧的氛围 。通过 Lr 调色&#xff0c;可以进一步强化这种特质并根据不同的风格需求进行创作。Lr&#xff08;Lightroom&#xff09;作为专业的图像后期处理软件&#xff0c;提供了丰富的调色…

数据结构(队列)

数据结构&#xff08;队列&#xff09; 什么是队列&#xff1f; 队列和栈类似&#xff0c;也是一类特殊的线性表。特殊之处也是在于操作上。队列&#xff1a;只允许在一端进行插入数据操作&#xff08;入队&#xff09;&#xff0c;在另一端进行删除数据操作&#xff08;出队&…

DeepSeek R1-7B 医疗大模型微调实战全流程分析(全码版)

DeepSeek R1-7B 医疗大模型微调实战全流程指南 目录 环境配置与硬件优化医疗数据工程微调策略详解训练监控与评估模型部署与安全持续优化与迭代多模态扩展伦理与合规体系故障排除与调试行业应用案例进阶调优技巧版本管理与迭代法律风险规避成本控制方案文档与知识传承1. 环境配…

[Lc7_分治-快排] 快速选择排序 | 数组中的第K个最大元素 | 库存管理 III

目录 1. 数组中的第K个最大元素 题解 代码 2.库存管理 III 代码 1. 数组中的第K个最大元素 题目链接&#xff1a;215. 数组中的第K个最大元素 题目分析&#xff1a; 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要…

集合论--形式化语言里的汇编码

如果一阶逻辑是数学这门形式化语言里的机器码&#xff0c;那么集合论就是数学这门形式化语言里的汇编码。 基本思想&#xff1a;从集合出发构建所有其它。 构建自然数构建整数构建有理数构建实数构建有序对、笛卡尔积、关系、函数、序列等构建确定有限自动机(DFA) 全景图 常…

RuoYi框架添加自己的模块(学生管理系统CRUD)

RuoYi框架添加自己的模块&#xff08;学生管理系统&#xff09; 框架顺利运行 首先肯定要顺利运行框架了&#xff0c;这个我不多说了 设计数据库表 在ry数据库中添加表tb_student 表字段如图所示 如图所示 注意id字段是自增的 注释部分是后面成功后前端要展示的部分 导入…

MybatisPlus

1.增删改查入门案例&#xff1a; 首先导入依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency> 然后这些增删改查…

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、过滤器&…

服务器上通过ollama部署deepseek

2025年1月下旬&#xff0c;DeepSeek的R1模型发布后的一周内就火了&#xff0c;性能比肩OpenAI的o1模型&#xff0c;且训练成本仅为560万美元&#xff0c;成本远低于openAI&#xff0c;使得英伟达股票大跌。 下面我们来看下如何个人如何部署deepseek-r1模型。 我是用的仙宫云的…

点云软件VeloView开发环境搭建与编译

官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程&#xff1a; 安装vs2019&#xff0c;windows sdk&#xff0c;qt5.14.2&#xff08;没安装到5.15.7&#xff09;&#xff0c;git&#xff0c;cmake3.31&#xff0c;python3.7.9&#xff0c;ninja下载放到…

【Git】创建,切换分支

理解分支 这里开始介绍Git的杀手级功能之一&#xff1a;分支。 分支就是科幻电影里的平行宇宙&#xff0c;当你正在电脑前努力学习C的时候&#xff0c;另一个你正在另一个平行宇宙里努力学习JAVA。 如果两个平行宇宙互不干扰&#xff0c;那对现在的你也没啥影响。不过&#…

FPGA 实验报告:四位全加器与三八译码器仿真实现

目录 安装Quartus软件 四位全加器 全加器、半加器 半加器&#xff1a; 全加器&#xff1a; 四位全加器电路图 创建项目 半加器 全加器 四位全加器 代码实现 半加器 全加器 四位全加器 三八译码器 创建项目 代码展示 modelsim仿真波形图 四位全加器 三八译码…

记录一次wifi版有人物联串口服务器调试经过

1、首先买了一个华为的wifi路由器&#xff0c;连接上以后&#xff0c;设置好网络名字和wifi密码 2、用网线连接串口服务器&#xff0c;通过192.168.1.1登录&#xff0c;进行配置 找到无线客户端配置&#xff0c;先在基本配置中打开5G配置&#xff0c;然后再去5.8G配置中设置 …

Vue3.5 企业级管理系统实战(八):Sidebar组件开发 2

本篇通过 Pinia 实现侧边栏&#xff08;Sidebar&#xff09;的展开收起功能&#xff0c;并通过 Pinia 实现展开状态的持久化。 1 安装 Pinia Persistedstate Pinia 是 Vue.js 的状态管理库&#xff0c;而 pinia-plugin-persistedstate 是一个针对 Pinia 的插件&#xff0c;它…

驱动 AI 边缘计算新时代!高性能 i.MX 95 应用平台引领未来

智慧浪潮崛起&#xff1a;AI与边缘计算的时代 正悄然深植于我们的日常生活之中&#xff0c;无论是火热的 ChatGPT 与 DeepSeek 语言模型&#xff0c;亦或是 Meta 智能眼镜&#xff0c;AI 技术已经无形地影响着我们的生活。这股变革浪潮并未停歇&#xff0c;而是进一步催生了更高…

vue3 vite项目安装eslint

npm install eslint -D 安装eslint库 npx eslint --init 初始化配置&#xff0c;按项目实际情况选 自动生成eslint.config.js&#xff0c;可以添加自定义rules 安装ESLint插件 此时打开vue文件就会标红有问题的位置 安装prettier npm install prettier eslint-config-pr…