C++设计模式与示例:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++设计模式与示例:从A到Z



设计模式(design patterns)是软件开发中常见问题的经过验证的解决方案。对于C++而言,这些模式尤为重要,因为该语言结合了面向对象、泛型和底层编程。在本文中,我们将通过代码示例剖析C++中的关键设计模式,帮助您编写更灵活、可重用且易于维护的代码。



我们将按照GoF(四人帮)分类法探讨三大类模式:创建型、结构型和行为型。每个模式都将通过C++的真实示例进行说明。



1. 创建型模式(Creational Patterns)



创建型模式抽象了对象的创建过程,使系统独立于对象的创建、组合和表示方式。



1.1. Singleton(单例模式)



单例模式确保一个类只有一个实例,并提供一个全局访问点。在C++中,通常通过静态局部对象实现(自C++11起线程安全)。



class Logger {public:    static Logger& getInstance() {        static Logger instance; // 线程安全初始化        return instance;    }

void log(const std::string& message) { std::cout << "[LOG] " << message << std::endl; }

private: Logger() = default; Logger(const Logger&) = delete; Logger& operator=(const Logger&) = delete;};

// 使用int main() { Logger::getInstance().log("应用程序已启动"); return 0;}


何时使用:配置管理、线程池、日志系统。



1.2. Factory Method(工厂方法)



工厂方法定义了一个创建对象的接口,但允许子类决定实例化哪个类。



class Product {public:    virtual void use() = 0;    virtual ~Product() = default;};

class ConcreteProductA : public Product {public: void use() override { std::cout << "产品A" << std::endl; }};

class ConcreteProductB : public Product {public: void use() override { std::cout << "产品B" << std::endl; }};

class Creator {public: virtual Product* createProduct() = 0; void someOperation() { Product* p = createProduct(); p->use(); delete p; } virtual ~Creator() = default;};

class CreatorA : public Creator {public: Product* createProduct() override { return new ConcreteProductA(); }};

class CreatorB : public Creator {public: Product* createProduct() override { return new ConcreteProductB(); }};


何时使用:当类不知道需要创建哪些子类的对象时。



2. 结构型模式(Structural Patterns)



结构型模式描述了如何将类和对象组合成更大的结构,同时保持灵活性和效率。



2.1. Adapter(适配器模式)



适配器模式允许接口不兼容的对象协同工作。在C++中,通常通过继承或组合实现。



// 目标接口class Target {public:    virtual void request() const {        std::cout << "普通请求" << std::endl;    }    virtual ~Target() = default;};

// 可适配类class Adaptee {public: void specificRequest() const { std::cout << "特定请求" << std::endl; }};

// 适配器(通过组合)class Adapter : public Target {private: Adaptee* adaptee_;public: Adapter(Adaptee* a) : adaptee_(a) {} void request() const override { adaptee_->specificRequest(); }};

博客

书籍推荐