设计模式是软件开发中常用的解决方案,它们提供了一些经过验证的方法来解决常见的设计问题。以下是单例模式、工厂模式和观察者模式在C++中的实现和应用场景的详细讲解。

1. 单例模式(Singleton Pattern)

概念

单例模式确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这对于管理全局状态、配置对象、日志记录对象等非常有用。

实现

在C++中实现单例模式通常涉及以下步骤:

  • 私有化构造函数、复制构造函数和赋值操作符,防止外部创建对象。
  • 提供一个静态方法来获取类的唯一实例。
    #include <iostream>
    #include <mutex>
    
    class Singleton {
    public:
        // 获取单例实例的静态方法
        static Singleton& getInstance() {
            static Singleton instance; // 使用静态局部变量确保唯一实例
            return instance;
        }
    
        // 示例方法
        void showMessage() {
            std::cout << "Hello from Singleton!" << std::endl;
        }
    
        // 删除复制构造函数和赋值操作符,防止复制
        Singleton(const Singleton&) = delete;
        Singleton& operator=(const Singleton&) = delete;
    
    private:
        // 私有构造函数,防止外部实例化
        Singleton() {
            std::cout << "Singleton Constructor Called" << std::endl;
        }
    };
    
    int main() {
        Singleton& instance1 = Singleton::getInstance();
        Singleton& instance2 = Singleton::getInstance();
    
        instance1.showMessage();
    
        if (&instance1 == &instance2) {
            std::cout << "Both instances are the same." << std::endl;
        }
    
        return 0;
    }
    

应用场景
  • 配置管理: 全局共享的配置管理器。
  • 日志系统: 统一的日志记录类,用于在整个应用程序中收集日志。
  • 资源管理: 控制对全局共享资源的唯一访问点,比如数据库连接池。

2. 工厂模式(Factory Pattern)

概念

工厂模式通过定义一个创建对象的接口,让子类决定实例化哪个类。工厂模式使一个类的实例化过程延迟到子类。

工厂模式包括以下几种常见变体:

  • 简单工厂模式(Simple Factory Pattern): 提供一个方法来创建对象。
  • 工厂方法模式(Factory Method Pattern): 定义一个接口来创建对象,由子类来决定实例化哪个具体的类。
  • 抽象工厂模式(Abstract Factory Pattern): 提供一个接口来创建一系列相关或依赖的对象,而不需要指定它们的具体类。
实现

下面是一个简单工厂模式的示例,用于创建不同类型的产品对象:

#include <iostream>
#include <memory>

// 产品基类
class Product {
public:
    virtual void show() = 0;
    virtual ~Product() = default;
};

// 具体产品类 A
class ConcreteProductA : public Product {
public:
    void show() override {
        std::cout << "ConcreteProductA created." << std::endl;
    }
};

// 具体产品类 B
class ConcreteProductB : public Product {
public:
    void show() override {
        std::cout << "ConcreteProductB created." << std::endl;
    }
};

// 简单工厂类
class SimpleFactory {
public:
    enum ProductType { PRODUCT_A, PRODUCT_B };

    static std::unique_ptr<Product> createProduct(ProductType type) {
        switch (type) {
            case PRODUCT_A:
                return std::make_unique<ConcreteProductA>();
            case PRODUCT_B:
                return std::make_unique<ConcreteProductB>();
            default:
                return nullptr;
        }
    }
};

int main() {
    auto productA = SimpleFactory::createProduct(SimpleFactory::PRODUCT_A);
    auto productB = SimpleFactory::createProduct(SimpleFactory::PRODUCT_B);

    productA->show();
    productB->show();

    return 0;
}
应用场景
  • 对象创建逻辑复杂: 当对象创建的逻辑非常复杂且可能涉及多个步骤时,工厂模式可以隐藏这些细节。
  • 解耦: 工厂模式可以将客户端与具体的类解耦,使得更容易扩展和维护。
  • 动态实例化: 根据运行时条件动态决定创建哪个类的实例。

3. 观察者模式(Observer Pattern)

概念

观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。它用于实现对象间的解耦通信。

实现

在C++中,实现观察者模式通常涉及以下组件:

  • 主体(Subject): 被观察的对象,它维护一个观察者列表,并在状态改变时通知它们。
  • 观察者(Observer): 接受通知并作出相应反应的对象。
    #include <iostream>
    #include <vector>
    #include <memory>
    
    // 观察者接口
    class Observer {
    public:
        virtual void update(int state) = 0;
        virtual ~Observer() = default;
    };
    
    // 具体观察者
    class ConcreteObserver : public Observer {
    public:
        void update(int state) override {
            std::cout << "Observer updated with state: " << state << std::endl;
        }
    };
    
    // 主体(被观察者)
    class Subject {
    public:
        void addObserver(std::shared_ptr<Observer> observer) {
            observers.push_back(observer);
        }
    
        void setState(int newState) {
            state = newState;
            notifyObservers();
        }
    
    private:
        void notifyObservers() {
            for (const auto& observer : observers) {
                observer->update(state);
            }
        }
    
        std::vector<std::shared_ptr<Observer>> observers;
        int state;
    };
    
    int main() {
        std::shared_ptr<Observer> observer1 = std::make_shared<ConcreteObserver>();
        std::shared_ptr<Observer> observer2 = std::make_shared<ConcreteObserver>();
    
        Subject subject;
        subject.addObserver(observer1);
        subject.addObserver(observer2);
    
        subject.setState(10);
        subject.setState(20);
    
        return 0;
    }
    
    应用场景
  • 事件处理系统: 当事件发生时,通知所有感兴趣的对象(例如 GUI 框架中的事件处理)。
  • 订阅发布系统: 允许多个对象订阅一个主题,当主题有更新时,所有订阅者都会收到通知。
  • 模型-视图-控制器(MVC)架构: 在MVC中,视图对象可以观察模型对象,当模型数据改变时,视图会自动更新。这些模式都是非常实用的工具,可以帮助开发者编写更灵活、可扩展和可维护的代码。

总结

单例模式用于确保一个类只有一个实例,适合管理全局状态或资源。

工厂模式用于创建对象,适合对象创建逻辑复杂或需要解耦的场景。

这些模式都是非常实用的工具,可以帮助开发者编写更灵活、可扩展和可维护的代码。

观察者模式用于在对象之间建立一对多的依赖关系,适合事件通知或数据同步的场景。

 

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐