C++的设计模式

ops/2025/2/25 23:44:46/

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.ppmy.cn/ops/161313.html

相关文章

Ubuntu Linux运维实战指南4_文件系统基础知识

4 文件系统的层次结构 文件系统是Ubuntu的核心内容之一。在Linux系统中&#xff0c;一切都是文件&#xff0c;而文件系统就是文件的组织和管理方式。可以这么说&#xff0c;在本书中除前3章外&#xff0c;其余的所有章节都会涉及文件系统。深入理解和掌握文件系统是每个Linux学…

精选案例展 | 智己汽车—全栈可观测驱动智能化运营与成本优化

本案例为“观测先锋 2024 可观测平台创新应用案例大赛”精选案例&#xff0c;同时荣获IT168“2024技术卓越奖评选-年度创新解决方案”奖。 项目背景 近年来&#xff0c;中国汽车行业进入转型升级阶段&#xff0c;智能网联技术成为行业发展的核心。车联网、自动驾驶等技术的加…

嵌入式面试题 CC++常见面试题整理_7

一.什么函数不能声明为虚函数 常见的不能声明为虚函数的有:普通函数(非成员函数):静态成员函数;内联成员函数;构造函数;友元函数。 1.为什么C不支持普通函数为虚函数普通函数(非成员函数)只能被overload&#xff0c;不能被override&#xff0c;声明为虚函数也没有什么意思&am…

华为云deepseek大模型平台:deepseek满血版

华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 1、注册&#xff1a; 华为云deepseek大模型平台注册&#xff1a;https://cloud.siliconflow.cn/i/aDmz6aVN 说明&#xff1a;填写邀请码的话邀请和被邀请的账号都会获得2000 万 Tokens&#xff1b;2个帐号间不会有其他关联…

Ubuntu20.04在线安装QT纪实

1、打开控制台窗口 CtrlAltT&#xff0c;打开控制台&#xff0c;如下图&#xff1a; 2、输入更新命令 输入命令&#xff0c;sudo apt-get update 如下图&#xff1a; 3、安装qt和qtcreate 输入如下的命令&#xff0c;sudo apt-get install qt5-default qtcreator 如下图&…

一.Vue中的条件渲染

1.在<head>中引用 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 2.在<body>中写入 <div id"app"><p><a v-if "user.usernameadmin"href"#">编辑</a><a …

数据同步的中间件

以下是10个支持MySQL、HBase、ClickHouse、HDFS等不同数据库之间数据同步的GitHub项目推荐&#xff1a; 项目名称语言主要特点支持的数据库GitHub链接DataXPython阿里巴巴开源的数据同步工具&#xff0c;支持多种数据库和文件系统。MySQL、ClickHouse、HDFS等GitHub链接Apache…

基于Spring Boot的农产品智慧物流系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…