跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 设计模式详解:创建、结构及行为型核心实现

C++ 设计模式涵盖创建型、结构型和行为型三大类共 23 种方案。文章通过具体代码示例解析单例、工厂、观察者等常用模式的实现细节,强调接口解耦与对象复用。内容包含核心模式优先掌握建议,结合现代 C++ 特性优化实践,帮助开发者构建高可维护性系统。避免过度设计,理解应用场景是关键。

追风少年发布于 2026/3/29更新于 2026/10/21124 浏览

C++ 设计模式详解:创建、结构及行为型核心实现

设计模式是解决软件设计中常见问题的成熟方案。在 C++ 开发中,合理运用这些模式能显著提升代码的可维护性与扩展性。本文将 23 种模式分为创建型、结构型和行为型三类,并结合实际代码展示核心实现。

一、创建型模式(5 个)

这类模式专注于对象的创建机制,将对象的实例化过程与使用过程解耦。

1. 单例模式(Singleton)⭐ 常用

确保一个类只有一个实例,并提供全局访问点。常用于配置管理器或日志记录器。

class Singleton {
private:
    static Singleton* instance;
    Singleton() {}
public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
    // 删除拷贝构造和赋值操作符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
};

2. 工厂方法模式(Factory Method)⭐ 常用

定义创建对象的接口,让子类决定实例化哪一个类。当产品体系变化时,只需新增具体工厂。

// 产品接口
class Product {
public:
    virtual ~Product() {}
    virtual void operation() = 0;
};

// 具体产品
class ConcreteProductA : public Product {
:
    { 
        std::cout <<  << std::endl; 
    }
};


  {
:
     ~() {}
    = ;
};


  :  Creator {
:
    { 
          (); 
    }
};
public
void operation() override
"Product A operation"
// 工厂接口
class
Creator
public
virtual
Creator
virtual Product* factoryMethod()
0
// 具体工厂
class
ConcreteCreatorA
public
public
Product* factoryMethod() override
return
new
ConcreteProductA

3. 抽象工厂模式(Abstract Factory)⭐ 常用

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

// 抽象产品 A
class AbstractProductA {
public:
    virtual ~AbstractProductA() {}
    virtual void operationA() = 0;
};

// 抽象产品 B
class AbstractProductB {
public:
    virtual ~AbstractProductB() {}
    virtual void operationB() = 0;
};

// 抽象工厂
class AbstractFactory {
public:
    virtual AbstractProductA* createProductA() = 0;
    virtual AbstractProductB* createProductB() = 0;
};

// 具体工厂 1
class ConcreteFactory1 : public AbstractFactory {
public:
    AbstractProductA* createProductA() override { return new ConcreteProductA1(); }
    AbstractProductB* createProductB() override { return new ConcreteProductB1(); }
};

4. 建造者模式(Builder)

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

class Product {
private: 
    std::string partA; 
    std::string partB;
public:
    void setPartA(const std::string& a) { partA = a; }
    void setPartB(const std::string& b) { partB = b; }
};

class Builder {
public:
    virtual ~Builder() {}
    virtual void buildPartA() = 0;
    virtual void buildPartB() = 0;
    virtual Product* getResult() = 0;
};

class Director {
private: 
    Builder* builder;
public:
    Director(Builder* b) : builder(b) {}
    void construct() { 
        builder->buildPartA(); 
        builder->buildPartB(); 
    }
};

5. 原型模式(Prototype)

通过复制现有实例来创建新实例,避免重复初始化开销。

class Prototype {
public:
    virtual ~Prototype() {}
    virtual Prototype* clone() const = 0;
    virtual void print() const = 0;
};

class ConcretePrototype : public Prototype {
private:
    int data;
public:
    ConcretePrototype(int d) : data(d) {}
    Prototype* clone() const override { return new ConcretePrototype(*this); }
    void print() const override { 
        std::cout << "Data: " << data << std::endl; 
    }
};

二、结构型模式(7 个)

处理类和对象的组合方式,使它们能更有效地协同工作。

6. 适配器模式(Adapter)⭐ 常用

将一个类的接口转换成客户希望的另一个接口,解决不兼容问题。

class Target {
public:
    virtual ~Target() {}
    virtual void request() { 
        std::cout << "Target request" << std::endl; 
    }
};

class Adaptee {
public:
    void specificRequest() { 
        std::cout << "Adaptee specific request" << std::endl; 
    }
};

class Adapter : public Target {
private: 
    Adaptee* adaptee;
public:
    Adapter(Adaptee* a) : adaptee(a) {}
    void request() override { 
        adaptee->specificRequest(); 
    }
};

7. 桥接模式(Bridge)

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

class Implementor {
public:
    virtual ~Implementor() {}
    virtual void operationImpl() = 0;
};

class Abstraction {
protected: 
    Implementor* impl;
public:
    Abstraction(Implementor* i) : impl(i) {}
    virtual ~Abstraction() {}
    virtual void operation() { 
        impl->operationImpl(); 
    }
};

8. 组合模式(Composite)

将对象组合成树形结构以表示'部分 - 整体'的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

class Component {
public:
    virtual ~Component() {}
    virtual void operation() = 0;
    virtual void add(Component*) {}
    virtual void remove(Component*) {}
    virtual Component* getChild(int) { return nullptr; }
};

class Leaf : public Component {
public:
    void operation() override { 
        std::cout << "Leaf operation" << std::endl; 
    }
};

class Composite : public Component {
private: 
    std::vector<Component*> children;
public:
    void operation() override { 
        std::cout << "Composite operation" << std::endl;
        for (auto child : children) { 
            child->operation(); 
        }
    }
    void add(Component* c) override { 
        children.push_back(c); 
    }
};

9. 装饰器模式(Decorator)⭐ 常用

动态地给一个对象添加一些额外的职责,比生成子类更为灵活。

class Component {
public:
    virtual ~Component() {}
    virtual void operation() = 0;
};

class ConcreteComponent : public Component {
public:
    void operation() override { 
        std::cout << "ConcreteComponent operation" << std::endl; 
    }
};

class Decorator : public Component {
protected: 
    Component* component;
public:
    Decorator(Component* c) : component(c) {}
    void operation() override { 
        component->operation(); 
    }
};

class ConcreteDecorator : public Decorator {
public:
    ConcreteDecorator(Component* c) : Decorator(c) {}
    void operation() override { 
        Decorator::operation(); 
        addedBehavior(); 
    }
    void addedBehavior() { 
        std::cout << "Added behavior" << std::endl; 
    }
};

10. 外观模式(Facade)⭐ 常用

为子系统中的一组接口提供一个一致的界面,定义一个高层接口,使子系统更容易使用。

class SubsystemA {
public:
    void operationA() { 
        std::cout << "Subsystem A operation" << std::endl; 
    }
};

class SubsystemB {
public:
    void operationB() { 
        std::cout << "Subsystem B operation" << std::endl; 
    }
};

class Facade {
private: 
    SubsystemA* a; 
    SubsystemB* b;
public:
    Facade() : a(new SubsystemA()), b(new SubsystemB()) {}
    void operation() { 
        a->operationA(); 
        b->operationB(); 
    }
};

11. 享元模式(Flyweight)

运用共享技术有效地支持大量细粒度的对象。

class Flyweight {
public:
    virtual ~Flyweight() {}
    virtual void operation(int extrinsicState) = 0;
};

class ConcreteFlyweight : public Flyweight {
private: 
    int intrinsicState;
public:
    ConcreteFlyweight(int state) : intrinsicState(state) {}
    void operation(int extrinsicState) override { 
        std::cout << "Intrinsic: " << intrinsicState << ", Extrinsic: " << extrinsicState << std::endl; 
    }
};

class FlyweightFactory {
private: 
    std::unordered_map<int, Flyweight*> flyweights;
public:
    Flyweight* getFlyweight(int key) {
        if (flyweights.find(key) == flyweights.end()) {
            flyweights[key] = new ConcreteFlyweight(key);
        }
        return flyweights[key];
    }
};

12. 代理模式(Proxy)⭐ 常用

为其他对象提供一种代理以控制对这个对象的访问。

class Subject {
public:
    virtual ~Subject() {}
    virtual void request() = 0;
};

class RealSubject : public Subject {
public:
    void request() override { 
        std::cout << "RealSubject request" << std::endl; 
    }
};

class Proxy : public Subject {
private: 
    RealSubject* realSubject;
public:
    Proxy() : realSubject(nullptr) {}
    void request() override {
        if (realSubject == nullptr) {
            realSubject = new RealSubject();
        }
        realSubject->request();
    }
};

三、行为型模式(11 个)

关注算法和请求的传递方式,增强对象间的通信能力。

13. 责任链模式(Chain of Responsibility)

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

class Handler {
protected: 
    Handler* successor;
public:
    Handler() : successor(nullptr) {}
    virtual ~Handler() {}
    void setSuccessor(Handler* s) { successor = s; }
    virtual void handleRequest(int request) = 0;
};

class ConcreteHandler1 : public Handler {
public:
    void handleRequest(int request) override {
        if (request < 10) {
            std::cout << "Handler1 handled request " << request << std::endl;
        } else if (successor != nullptr) {
            successor->handleRequest(request);
        }
    }
};

14. 命令模式(Command)⭐ 常用

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。

class Receiver {
public:
    void action() { 
        std::cout << "Receiver action" << std::endl; 
    }
};

class Command {
public:
    virtual ~Command() {}
    virtual void execute() = 0;
};

class ConcreteCommand : public Command {
private: 
    Receiver* receiver;
public:
    ConcreteCommand(Receiver* r) : receiver(r) {}
    void execute() override { 
        receiver->action(); 
    }
};

class Invoker {
private: 
    Command* command;
public:
    void setCommand(Command* c) { command = c; }
    void executeCommand() { 
        command->execute(); 
    }
};

15. 解释器模式(Interpreter)

给定一个语言,定义它的文法的一种表示,并定义一个解释器。

class Context {};

class Expression {
public:
    virtual ~Expression() {}
    virtual bool interpret(Context& context) = 0;
};

class TerminalExpression : public Expression {
public:
    bool interpret(Context& context) override {
        // 终结符解释逻辑
        return true;
    }
};

16. 迭代器模式(Iterator)⭐ 常用

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

template<typename T>
class Iterator {
public:
    virtual ~Iterator() {}
    virtual T next() = 0;
    virtual bool hasNext() = 0;
};

template<typename T>
class ConcreteIterator : public Iterator<T> {
private: 
    std::vector<T> collection; 
    size_t position;
public:
    ConcreteIterator(const std::vector<T>& col) : collection(col), position(0) {}
    T next() override { return collection[position++]; }
    bool hasNext() override { return position < collection.size(); }
};

17. 中介者模式(Mediator)

用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用。

class Colleague;
class Mediator {
public:
    virtual ~Mediator() {}
    virtual void notify(Colleague* sender, std::string event) = 0;
};

class Colleague {
protected: 
    Mediator* mediator;
public:
    Colleague(Mediator* m = nullptr) : mediator(m) {}
    void setMediator(Mediator* m) { mediator = m; }
};

class ConcreteColleague1 : public Colleague {
public:
    void doSomething() {
        // ... 自己的逻辑
        mediator->notify(this, "event1");
    }
};

18. 备忘录模式(Memento)

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

class Memento {
private: 
    std::string state;
public:
    Memento(const std::string& s) : state(s) {}
    std::string getState() const { return state; }
};

class Originator {
private: 
    std::string state;
public:
    void setState(const std::string& s) { state = s; }
    std::string getState() const { return state; }
    Memento* createMemento() { return new Memento(state); }
    void restoreMemento(Memento* m) { state = m->getState(); }
};

19. 观察者模式(Observer)⭐ 常用

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

class Observer {
public:
    virtual ~Observer() {}
    virtual void update(float temperature) = 0;
};

class Subject {
private: 
    std::vector<Observer*> observers;
public:
    void attach(Observer* o) { observers.push_back(o); }
    void detach(Observer* o) { /* 移除观察者逻辑 */ }
    void notify(float temperature) {
        for (auto observer : observers) {
            observer->update(temperature);
        }
    }
};

class ConcreteObserver : public Observer {
public:
    void update(float temperature) override { 
        std::cout << "Temperature updated: " << temperature << std::endl; 
    }
};

20. 状态模式(State)

允许一个对象在其内部状态改变时改变它的行为。

class Context;
class State {
public:
    virtual ~State() {}
    virtual void handle(Context* context) = 0;
};

class Context {
private: 
    State* state;
public:
    Context(State* s) : state(s) {}
    void setState(State* s) { state = s; }
    void request() { state->handle(this); }
};

class ConcreteStateA : public State {
public:
    void handle(Context* context) override;
};

21. 策略模式(Strategy)⭐ 常用

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。

class Strategy {
public:
    virtual ~Strategy() {}
    virtual void algorithm() = 0;
};

class ConcreteStrategyA : public Strategy {
public:
    void algorithm() override { 
        std::cout << "Strategy A algorithm" << std::endl; 
    }
};

class Context {
private: 
    Strategy* strategy;
public:
    Context(Strategy* s) : strategy(s) {}
    void setStrategy(Strategy* s) { strategy = s; }
    void executeStrategy() { strategy->algorithm(); }
};

22. 模板方法模式(Template Method)⭐ 常用

定义一个操作中的算法骨架,而将一些步骤延迟到子类中。

class AbstractClass {
public:
    virtual ~AbstractClass() {}
    void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
    }
    virtual void primitiveOperation1() = 0;
    virtual void primitiveOperation2() = 0;
};

class ConcreteClass : public AbstractClass {
public:
    void primitiveOperation1() override { 
        std::cout << "Concrete operation 1" << std::endl; 
    }
    void primitiveOperation2() override { 
        std::cout << "Concrete operation 2" << std::endl; 
    }
};

23. 访问者模式(Visitor)

表示一个作用于某对象结构中的各元素的操作。

class ConcreteElementA;
class ConcreteElementB;
class Visitor {
public:
    virtual ~Visitor() {}
    virtual void visit(ConcreteElementA* element) = 0;
    virtual void visit(ConcreteElementB* element) = 0;
};

class Element {
public:
    virtual ~Element() {}
    virtual void accept(Visitor* visitor) = 0;
};

class ConcreteElementA : public Element {
public:
    void accept(Visitor* visitor) override { visitor->visit(this); }
    void operationA() { 
        std::cout << "Operation A" << std::endl; 
    }
};

四、学习建议与总结

在实际工作中,不必掌握所有 23 种模式,优先理解以下核心场景:

  1. 必须掌握的 5 个核心模式:

    • 单例模式:全局唯一实例,如配置管理器。
    • 工厂方法模式:对象创建解耦,易于扩展。
    • 观察者模式:事件处理、消息通知系统。
    • 策略模式:算法封装,运行时切换。
    • 装饰器模式:动态添加功能。
  2. 次常用的 5 个模式:

    • 适配器、代理、模板方法、命令、外观模式。
  3. 避坑指南:

    • 避免过度设计,只在必要时使用设计模式。
    • 结合 C++11/14/17 的现代特性(智能指针、lambda 等)简化实现。
    • 理解每种模式的应用场景比死记代码更重要。

这些模式提供了经过验证的解决方案,能帮助构建更灵活、可维护的软件系统。

目录

  1. C++ 设计模式详解:创建、结构及行为型核心实现
  2. 一、创建型模式(5 个)
  3. 1. 单例模式(Singleton)⭐ 常用
  4. 2. 工厂方法模式(Factory Method)⭐ 常用
  5. 3. 抽象工厂模式(Abstract Factory)⭐ 常用
  6. 4. 建造者模式(Builder)
  7. 5. 原型模式(Prototype)
  8. 二、结构型模式(7 个)
  9. 6. 适配器模式(Adapter)⭐ 常用
  10. 7. 桥接模式(Bridge)
  11. 8. 组合模式(Composite)
  12. 9. 装饰器模式(Decorator)⭐ 常用
  13. 10. 外观模式(Facade)⭐ 常用
  14. 11. 享元模式(Flyweight)
  15. 12. 代理模式(Proxy)⭐ 常用
  16. 三、行为型模式(11 个)
  17. 13. 责任链模式(Chain of Responsibility)
  18. 14. 命令模式(Command)⭐ 常用
  19. 15. 解释器模式(Interpreter)
  20. 16. 迭代器模式(Iterator)⭐ 常用
  21. 17. 中介者模式(Mediator)
  22. 18. 备忘录模式(Memento)
  23. 19. 观察者模式(Observer)⭐ 常用
  24. 20. 状态模式(State)
  25. 21. 策略模式(Strategy)⭐ 常用
  26. 22. 模板方法模式(Template Method)⭐ 常用
  27. 23. 访问者模式(Visitor)
  28. 四、学习建议与总结

更多推荐文章

查看全部
  • Java BigDecimal 数值比较与舍入模式详解
  • Qwen-Image-Edit-2511 评测:AI 绘画的空间逻辑与几何精度
  • Dify MCP Server:将工作流发布为第三方可调用服务
  • Linux 内核开发笔记:休眠唤醒、Proc 文件系统、调试与性能工具
  • 内网渗透基础:域环境权限获取与维持
  • ThinkPHP 5.1 环境安装与配置指南
  • 面试高频缓存算法:LRU 与 LFU 原理及 Java 实现
  • MCP 实战:Figma 设计稿自动转前端代码
  • 5 款国产免费 AI 代码助手评测对比
  • 基于扣子平台搭建 AI 智能体与变现路径指南
  • Qwen2.5-VL 系列模型正式开源及实测分析
  • 网络安全工程师获取高薪的核心能力与素质要求
  • Java 核心面试知识点与实战解析
  • 9 款免费 AI 论文工具实测:从写作到查重全流程解析
  • Python 中文繁简体转换工具 openccpy 使用指南
  • Neo4j Desktop 2 安装配置与图数据库实战
  • 大模型时代:重构技术开发的生产与组织方式
  • 我用 Nexent 做了个 AI 大厨:基于 Nexent 知识库与 MCP 生态打造智能烹饪顾问实战
  • GitHub Copilot 接入第三方 OpenAI 接口无需扩展
  • OpenAI 指控 DeepSeek 非法蒸馏,字节发布 Seedance 2.0,Java 26 预览版上线

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online