有哪些常见的架构设计模式在现代C++中应用

在现代C++中,以下架构设计模式被广泛应用:


1. 工厂模式

核心思想 :封装对象的创建逻辑,通过统一接口生成不同类型对象。
现代实现:

  • 使用智能指针(如 std::unique_ptr)管理资源
  • 结合模板或 std::function 实现泛型工厂
cpp 复制代码
class IProduct {
public:
    virtual ~IProduct() = default;
    virtual void operation() = 0;
};

template <typename T>
std::unique_ptr<IProduct> createProduct() {
    return std::make_unique<T>();
}

2. RAII(资源获取即初始化)

核心思想 :通过对象生命周期自动管理资源(内存、文件句柄等)。
现代特性:

  • 智能指针(std::unique_ptr, std::shared_ptr)
  • 移动语义(避免深拷贝)
cpp 复制代码
class FileHandler {
public:
    FileHandler(const std::string& path) : handle(openFile(path)) {}
    ~FileHandler() { closeFile(handle); }
    // 禁用拷贝,启用移动
    FileHandler(FileHandler&&) = default;
private:
    HandleType handle;
};

3. 观察者模式

核心思想 :对象状态变化时自动通知依赖它的对象。
现代优化:

  • 使用 std::function 替代虚函数接口
  • 结合 std::vector 存储观察者
cpp 复制代码
class Subject {
public:
    void addObserver(std::function<void()> obs) {
        observers.push_back(obs);
    }
    void notify() {
        for (auto& obs : observers) obs();
    }
private:
    std::vector<std::function<void()>> observers;
};

4. 策略模式

核心思想 :将算法封装为独立对象,支持运行时切换。
现代实现:

  • 通过 std::function 和 Lambda 表达式简化策略定义
cpp 复制代码
class Context {
public:
    void setStrategy(std::function<void()> strategy) {
        this->strategy = strategy;
    }
    void execute() { strategy(); }
private:
    std::function<void()> strategy;
};

// 使用示例
Context ctx;
ctx.setStrategy([] { /* 策略A逻辑 */ });
ctx.execute();

5. 单例模式

核心思想 :确保类仅有一个实例,并提供全局访问点。
线程安全改进:

  • C++11 后的 std::call_once 保证初始化原子性
cpp 复制代码
class Singleton {
public:
    static Singleton& getInstance() {
        static std::once_flag flag;
        std::call_once(flag, [] { instance.reset(new Singleton); });
        return *instance;
    }
private:
    static std::unique_ptr<Singleton> instance;
    Singleton() = default;
};

6. 适配器模式

核心思想 :转换不兼容接口为目标接口。
现代应用:

  • 结合模板实现泛型适配
  • 使用 std::bind 包装旧接口
cpp 复制代码
class LegacySystem {
public:
    void legacyOperation(int x) { /*...*/ }
};

class Adapter {
public:
    Adapter(LegacySystem& legacy) : adaptee(legacy) {}
    void modernOperation() {
        std::bind(&LegacySystem::legacyOperation, &adaptee, 42)();
    }
private:
    LegacySystem& adaptee;
};

总结

现代C++通过以下特性优化传统设计模式:

  1. 智能指针(自动资源管理)
  2. Lambda 和 std::function(减少虚函数开销)
  3. 移动语义(提升性能)
  4. 模板(增强泛化能力)

选择模式时需结合具体场景,避免过度设计。

相关推荐
云和数据.ChenGuang32 分钟前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes
揣一尾游鱼yu40 分钟前
内部类和Object笔记
java·开发语言·object·内部类
小鱼仙官1 小时前
Qt 主界面弹出分界面
开发语言·qt
你怎么知道我是队长1 小时前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++
冻柠檬飞冰走茶2 小时前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
damoluomu2 小时前
Node 的 Headless 出厂没有前台,Java 的 Headless 是从门户里长出来的
java·开发语言·node.js
我命由我123452 小时前
Python 实用操作 - 文件操作(打开与关闭文件、读取文件、文件写入)
java·开发语言·前端·javascript·数据库·python·java-ee
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛
冻柠檬飞冰走茶2 小时前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
Дерек的学习记录2 小时前
Unreal Engine 5:第三人称运动系统和人物动画
开发语言·学习·ue5