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(); }};