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

C++的设计模式

1. 创建型模式

单例模式 (Singleton)
  • 意图:确保类仅有一个实例,并提供全局访问点。(常见的日志类)
  • 实现
    class Singleton {
    private:static Singleton* instance;Singleton() {} // 私有构造函数
    public:static Singleton* getInstance() {if (!instance) {instance = new Singleton();}return instance;}// 删除拷贝构造和赋值Singleton(const Singleton&) = delete;void operator=(const Singleton&) = delete;
    };
    Singleton* Singleton::instance = nullptr;
    
  • 线程安全:需加锁(如std::mutex)或使用C++11的std::call_once
工厂模式 (Factory)
  • 简单工厂:根据参数创建不同对象。
    class Product {
    public:virtual void use() = 0;
    };
    class ConcreteProductA : public Product { /*...*/ };
    class Factory {
    public:static Product* createProduct(const std::string& type) {if (type == "A") return new ConcreteProductA();// ...}
    };
    
  • 抽象工厂:创建相关对象族。
    class AbstractFactory {
    public:virtual Button* createButton() = 0;virtual TextBox* createTextBox() = 0;
    };
    class WinFactory : public AbstractFactory { /*...*/ };
    

2. 结构型模式

适配器模式 (Adapter)
  • 对象适配器:持有被适配对象的实例。
    class Target {
    public:virtual void request() = 0;
    };
    class Adaptee { public: void specificRequest() {} };
    class Adapter : public Target {Adaptee* adaptee;
    public:Adapter(Adaptee* a) : adaptee(a) {}void request() override { adaptee->specificRequest(); }
    };
    
装饰器模式 (Decorator)
  • 动态添加职责
    class Component { public: virtual void operation() = 0; };
    class ConcreteComponent : public Component { /*...*/ };
    class Decorator : public Component {Component* component;
    public:Decorator(Component* c) : component(c) {}void operation() override { component->operation(); }
    };
    class ConcreteDecorator : public Decorator {void addedBehavior() { /*...*/ }
    public:void operation() override {Decorator::operation();addedBehavior();}
    };
    

3. 行为型模式

观察者模式 (Observer)
  • 实现松散耦合
    class Observer {
    public:virtual void update(const std::string& msg) = 0;
    };
    class Subject {std::vector<Observer*> observers;
    public:void attach(Observer* o) { observers.push_back(o); }void notify(const std::string& msg) {for (auto o : observers) o->update(msg);}
    };
    
策略模式 (Strategy)
  • 运行时切换算法
    class Strategy {
    public:virtual void execute() = 0;
    };
    class Context {Strategy* strategy;
    public:void setStrategy(Strategy* s) { strategy = s; }void execute() { strategy->execute(); }
    };
    

4. C++特定注意事项

  • 内存管理:优先使用智能指针(std::shared_ptr, std::unique_ptr)避免泄漏。
  • 多线程:单例模式需双重检查锁定或局部静态变量(C++11后线程安全)。
  • 性能:虚函数可能引入开销,需权衡设计灵活性与性能。
  • 模板:替代某些模式(如策略模式可通过模板在编译时绑定)。

总结

  • 选择模式的原则:优先简单性,避免过度设计。
  • 模式组合:如工厂+单例创建全局唯一对象,观察者+组合构建事件系统。
  • 语言特性结合:利用RAII、模板、移动语义等增强实现。
http://www.lryc.cn/news/541958.html

相关文章:

  • C++手撕AVL树
  • 写大论文的word版本格式整理,实现自动生成目录、参考文献序号、公式序号、图表序号
  • Redission可重试、超时续约的实现原理(源码分析)
  • java八股文-消息队列
  • 3分钟idea接入deepseek
  • 【DeepSeek与鸿蒙HarmonyOS:开启应用开发新次元】
  • 基于光度立体视觉的三维重建方法
  • 在VSCode中接入deepseek
  • DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明
  • 申请SSL证书,如何完成域名验证
  • HTTP实验(ENSP模拟器实现)
  • AI工具评论
  • comfy UI节点缺失dlib库处理
  • STM32 HAL库I2C函数使用详解:以MPU6050传感器为例
  • 四步彻底卸载IDEA!!!
  • vue3 背景虚化,文字高亮效果
  • 开源一个可以调RGB三色的小灯棒子
  • 在聚类算法的领域特定语言(DSL)中添加一个度量矩阵组件
  • 【C++】list 链表的使用+模拟实现
  • AI助力小微企业技术开发规范化管理 | 杂谈
  • Android 实现 RTMP 推流:快速集成指南
  • pipeline 使用git parameter插件实现动态选择分支构造
  • postcss.config.js 动态配置基准值
  • DeepSeek 冲击(含本地化部署实践)
  • eNSP下载安装(eNsp、WinPcap、Wireshark、VirtualBox下载安装)
  • 利用Ai对生成的测试用例进行用例评审
  • C#上位机--跳转语句
  • `sh` 与 `bash` 的区别详解
  • *PyCharm 安装教程
  • [特殊字符] Elasticsearch 双剑合璧:HTTP API 与 Java API 实战整合指南