跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

设计模式在 C++ 面向对象开发中的应用

综述由AI生成设计模式是面向对象编程的最佳实践,用于解决常见设计问题并提升代码可维护性与扩展性。文章涵盖单例、工厂、观察者和策略四种核心模式及其 C++ 实现。单例模式管理全局资源;工厂模式解耦对象创建;观察者模式处理事件依赖;策略模式封装算法切换。结合任务调度系统实战案例,展示了如何应用这些模式构建灵活、低耦合的系统架构。

氛围发布于 2026/3/23更新于 2026/5/17 浏览
设计模式在 C++ 面向对象开发中的应用

设计模式在 C++ 面向对象开发中的应用

设计模式是面向对象编程中的一种最佳实践,能够帮助开发者解决常见的设计问题,提升代码的可维护性和可扩展性。以下是几种常用设计模式在 C++ 开发中的应用解析。

单例模式(Singleton)

单例模式确保一个类只有一个实例,并提供一个全局访问点。该模式在需要全局访问某个资源时非常有用,例如日志记录器、配置管理器等。但需要注意的是,单例模式可能会引入全局状态,从而增加代码的耦合性。

#include <iostream>

class Singleton {
private:
    static Singleton* instance;
    Singleton() {}

public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }

    void showMessage() const {
        std::cout << "Hello from Singleton!" << std::endl;
    }
};

// 初始化静态成员变量
Singleton* Singleton::instance = nullptr;

int main() {
    Singleton* s1 = Singleton::getInstance();
    Singleton* s2 = Singleton::getInstance();
    s1->showMessage();
    s2->showMessage();
    std::cout << "Same instance: " << (s1 == s2 ? "Yes" : "No") << std::endl;
    return 0;
}

工厂模式(Factory)

工厂模式用于创建对象,而无需指定具体的类。通过将对象的创建逻辑封装在工厂类中,使得代码更加灵活和可扩展。当需要添加新的类时,只需扩展工厂类即可,无需修改客户端代码。

#include <iostream>
#include <memory>
#include <string>

// 基类
class Shape {
public:
    virtual void draw() const = 0;
    virtual ~Shape() = default;
};

// 具体类
class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a Circle" << std::endl;
    }
};

class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a Rectangle" << std::endl;
    }
};

// 工厂类
class ShapeFactory {
public:
    std::unique_ptr<Shape> getShape(const std::string& shapeType) {
        if (shapeType == "CIRCLE") {
            return std::make_unique<Circle>();
        } else if (shapeType == "RECTANGLE") {
            return std::make_unique<Rectangle>();
        }
        return nullptr;
    }
};

int main() {
    ShapeFactory shapeFactory;
    auto shape1 = shapeFactory.getShape("CIRCLE");
    shape1->draw();
    auto shape2 = shapeFactory.getShape("RECTANGLE");
    shape2->draw();
    return 0;
}

观察者模式(Observer)

观察者模式用于实现对象之间的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会自动更新。该模式非常适合实现事件驱动的系统,例如 GUI 应用程序中的事件监听机制。通过观察者模式,可以实现低耦合的设计,使得系统的扩展更加灵活。

#include <iostream>
#include <vector>
#include <string>

// 抽象观察者
class Observer {
public:
    virtual void update(const std::string& message) = 0;
    virtual ~Observer() = default;
};

// 抽象主题
class Subject {
private:
    std::vector<Observer*> observers;

public:
    void attach(Observer* observer) {
        observers.push_back(observer);
    }

    void detach(Observer* observer) {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    void notify(const std::string& message) {
        for (auto observer : observers) {
            observer->update(message);
        }
    }
};

// 具体观察者
class ConcreteObserver : public Observer {
public:
    void update(const std::string& message) override {
        std::cout << "Observer received message: " << message << std::endl;
    }
};

int main() {
    Subject subject;
    ConcreteObserver observer1, observer2;
    subject.attach(&observer1);
    subject.attach(&observer2);
    subject.notify("Hello Observers!");
    subject.detach(&observer1);
    subject.notify("Observer1 detached.");
    return 0;
}

策略模式(Strategy)

策略模式用于定义一系列算法,并将它们封装在独立的类中。通过将算法封装在独立的类中,使得算法可以独立于客户端代码进行扩展和修改。这种方式不仅提高了代码的可维护性,还使得算法的切换更加灵活。

#include <iostream>
#include <vector>
#include <algorithm>

// 抽象策略
class SortStrategy {
public:
    virtual void sort(std::vector<int>& data) const = 0;
    virtual ~SortStrategy() = default;
};

// 具体策略:冒泡排序
class BubbleSort : public SortStrategy {
public:
    void sort(std::vector<int>& data) const override {
        for (size_t i = 0; i < data.size(); ++i) {
            for (size_t j = 0; j < data.size() - i - 1; ++j) {
                if (data[j] > data[j + 1]) {
                    std::swap(data[j], data[j + 1]);
                }
            }
        }
    }
};

// 具体策略:快速排序
class QuickSort : public SortStrategy {
public:
    void sort(std::vector<int>& data) const override {
        std::sort(data.begin(), data.end());
    }
};

// 上下文类
class Sorter {
private:
    SortStrategy* strategy;

public:
    Sorter(SortStrategy* strategy) : strategy(strategy) {}

    void setStrategy(SortStrategy* strategy) {
        this->strategy = strategy;
    }

    void sort(std::vector<int>& data) {
        strategy->sort(data);
    }
};

int main() {
    std::vector<int> data = {5, 2, 9, 1, 5, 6};
    Sorter sorter(new BubbleSort());
    sorter.sort(data);
    std::cout << "Sorted data (Bubble Sort): ";
    for (int num : data) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    sorter.setStrategy(new QuickSort());
    sorter.sort(data);
    std::cout << "Sorted data (Quick Sort): ";
    for (int num : data) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}

设计模式的实际应用价值

灵活性

设计模式提供了一种灵活的解决方案,能够帮助开发者解决常见的设计问题。例如,工厂模式通过封装对象的创建逻辑,使得代码更加灵活和可扩展;观察者模式通过解耦对象之间的依赖关系,使得系统的扩展更加灵活。

提升代码的可维护性

设计模式通过面向对象的思想,将复杂的逻辑封装在独立的类中,使得代码更加清晰和易于维护。例如,策略模式通过将算法封装在独立的类中,使得算法的修改和扩展不会影响客户端代码。

面向对象设计原则的应用

面向对象设计的一些基本原则,如单一职责原则、开闭原则、里氏替换原则等,为设计模式的应用提供了指导,帮助开发者设计出更合理、更灵活的系统。

实战案例:任务调度系统

在实际项目中,可以将所学知识应用到任务调度系统中,管理任务的创建、执行和通知机制。通过工厂模式和观察者模式来实现这一功能。

工厂模式的应用

使用工厂模式来创建任务对象。任务对象的类型可以根据任务的类型动态决定。

#include <iostream>
#include <memory>
#include <string>

// 基类
class Task {
public:
    virtual void execute() const = 0;
    virtual ~Task() = default;
};

// 具体任务
class EmailTask : public Task {
public:
    void execute() const override {
        std::cout << "Sending email..." << std::endl;
    }
};

class FileTask : public Task {
public:
    void execute() const override {
        std::cout << "Processing file..." << std::endl;
    }
};

// 工厂类
class TaskFactory {
public:
    std::unique_ptr<Task> createTask(const std::string& taskType) {
        if (taskType == "EMAIL") {
            return std::make_unique<EmailTask>();
        } else if (taskType == "FILE") {
            return std::make_unique<FileTask>();
        }
        return nullptr;
    }
};

int main() {
    TaskFactory taskFactory;
    auto task1 = taskFactory.createTask("EMAIL");
    task1->execute();
    auto task2 = taskFactory.createTask("FILE");
    task2->execute();
    return 0;
}

观察者模式的应用

使用观察者模式来实现任务状态变化的通知机制。任务对象作为主题,观察者可以注册到任务对象上,并在任务状态变化时接收通知。

#include <iostream>
#include <vector>
#include <string>

// 抽象观察者
class Observer {
public:
    virtual void update(const std::string& message) = 0;
    virtual ~Observer() = default;
};

// 抽象主题
class Subject {
private:
    std::vector<Observer*> observers;

public:
    void attach(Observer* observer) {
        observers.push_back(observer);
    }

    void detach(Observer* observer) {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    void notify(const std::string& message) {
        for (auto observer : observers) {
            observer->update(message);
        }
    }
};

// 具体主题:任务
class TaskSubject : public Subject {
private:
    std::string status;

public:
    void setStatus(const std::string& newStatus) {
        status = newStatus;
        notify("Task status changed to: " + status);
    }
};

// 具体观察者
class TaskObserver : public Observer {
public:
    void update(const std::string& message) override {
        std::cout << "Observer received message: " << message << std::endl;
    }
};

int main() {
    TaskSubject task;
    TaskObserver observer1, observer2;
    task.attach(&observer1);
    task.attach(&observer2);
    task.setStatus("RUNNING");
    task.setStatus("COMPLETED");
    task.detach(&observer1);
    task.setStatus("FAILED");
    return 0;
}

总结

设计模式是构建高质量软件架构的重要工具。通过应用单例、工厂、观察者和策略等模式,可以有效提升系统的灵活性、可维护性和可扩展性。结合面向对象设计原则,开发者能够设计出更加合理且易于演进的代码结构。

目录

  1. 设计模式在 C++ 面向对象开发中的应用
  2. 单例模式(Singleton)
  3. 工厂模式(Factory)
  4. 观察者模式(Observer)
  5. 策略模式(Strategy)
  6. 设计模式的实际应用价值
  7. 灵活性
  8. 提升代码的可维护性
  9. 面向对象设计原则的应用
  10. 实战案例:任务调度系统
  11. 工厂模式的应用
  12. 观察者模式的应用
  13. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Whisper-Large-V3-Turbo:极速多语言语音识别技术解析
  • Z-Image-Turbo Sugar 脸部 LoRA 部署与使用指南
  • 灵感画廊:基于 SDXL 的极简 AI 绘画工具实战
  • CCF-GESP 2025 年 9 月 C++ 一级真题解析
  • Linux 进程与线程的区别与联系:定义、资源与调度
  • OpenClaw 多智能体配置指南:持久代理与子代理设置
  • CoPaw 个人助理部署与定制指南:从本地到飞书接入
  • 攻防世界 Web 题解:Lottery 与 ics-05 漏洞分析
  • 利用AI提升鸿蒙开发效率:Rules与智能实践
  • Flutter Web 开发解决跨域(CORS)问题指南
  • 基于 openJiuwen 记忆库新特性的 AI 职业规划助手搭建
  • 机器学习常见名词汇总
  • React Native 核心价值与移动端开发趋势分析
  • 微信 ClawBot 插件接入个人微信及 Windows 安装避坑指南
  • 基于 Windows 环境的 wnmp web 开发环境的研究与实践开题报告2
  • 无需 GPU 也能跑:RetinaFace+CurricularFace 轻量级部署实战
  • HarmonyOS 应用开发:ArkTS 语言基础与语法详解
  • 常见机器学习模型评估指标与方法汇总
  • 机器人身体结构与人体仿生学:四肢结构设计原则
  • String 字符串的存储结构详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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