C++单例模式、工厂模式、观察者模式等的实现和应用场景。

news/2024/7/8 4:06:31 标签: c++, 单例模式, 观察者模式

设计模式是软件开发中常用的解决方案,它们提供了一些经过验证的方法来解决常见的设计问题。以下是单例模式、工厂模式和观察者模式在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中,视图对象可以观察模型对象,当模型数据改变时,视图会自动更新。这些模式都是非常实用的工具,可以帮助开发者编写更灵活、可扩展和可维护的代码。

总结

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

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

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

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

 


http://www.niftyadmin.cn/n/5536416.html

相关文章

谷粒商城学习-06-使用vagrant快速创建linux虚拟机

这一节的内容是在Windows上安装虚拟机。 为什么要按照虚拟机呢&#xff1f; 原因是很多软件只能在Linux下运行&#xff0c;有的虽然也可以在Windows上运行&#xff0c;但从安装到运行会遇到很多问题&#xff0c;为这些解决这些问题花时间对于大多数人特别是初学者是没有什么价…

Docker实战教程(一)

文章目录 Docker实战教程一、Docker简介二、Docker安装过程1. Windows上安装Docker2. Linux上安装Docker三、Docker基本概念四、Docker常用命令五、Docker常见应用场景六、总结Docker实战教程 Docker是一种开源的容器化平台,能够自动化应用程序的部署、管理和隔离。它使得开发…

代谢组数据分析(十二):岭回归、Lasso回归、弹性网络回归构建预测模型

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 在代谢物预测模型的构建中,我们采用了三种主流的回归分析方法:岭回归、Lasso回归以及弹性网络回归。这三种方法各有其独特的原理和适用场景,因此在…

构建LangChain应用程序的示例代码:53、利用多模态大型语言模型在RAG应用中处理混合文档的示例

许多文档包含多种内容类型&#xff0c;包括文本和图像。 然而&#xff0c;在大多数 RAG 应用中&#xff0c;图像中捕获的信息都会丢失。 随着多模态LLMs的出现&#xff0c;比如GPT-4V&#xff0c;如何在RAG中利用图像是值得考虑的。 本篇指南的亮点是&#xff1a; 使用非结…

ActiViz中的颜色映射表vtkLookupTable

文章目录 一、简介二、VtkLookupTable的创建与初始化三、设置数据范围四、颜色映射设置五、不透明度设置六、自定义颜色映射七、 不连续性颜色映射八、 预设颜色映射方案九、可视化效果优化十、与其他VTK组件的整合十一、 动态调整映射表十二、保存和加载颜色映射表一、简介 V…

中英双语介绍中国香港(Hong Kong, China)

中文版&#xff1a;香港简介 香港特别行政区简介 经济概况 香港是中国的特别行政区&#xff0c;以其繁荣的经济和国际金融中心的地位著称。香港的经济主要包括以下几个方面&#xff1a; 金融服务&#xff1a;香港是全球领先的金融中心之一&#xff0c;拥有大量的跨国银行、金…

MySQL-作业1

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 二、创建表 1、创建一个名称为db_system的数据库 2、在该数据库下创建两张表&#xff0c;具体要求如下&#xff1a; 员工表 user …

日本最新型高达式巨型机器人承担铁路维护任务

日本有制造现实生活中的高达式巨型机器人的历史&#xff0c;但它们往往是用于娱乐目的&#xff0c;而不是实际应用。不过&#xff0c;日本刚刚开始使用一个 40 英尺高的人形机器人来维护铁路线。 大约两年前&#xff0c;西日本铁路公司&#xff08;JR 西日本&#xff09;制造了…