首页 > 编程语言 >C++单例模式、工厂模式、观察者模式等的实现和应用场景。

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

时间:2024-07-04 14:27:29浏览次数:17  
标签:std 对象 观察者 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中,视图对象可以观察模型对象,当模型数据改变时,视图会自动更新。这些模式都是非常实用的工具,可以帮助开发者编写更灵活、可扩展和可维护的代码。

总结

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

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

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

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

 

标签:std,对象,观察者,C++,实例,模式,单例
From: https://blog.csdn.net/qq_44905692/article/details/140172425

相关文章

  • 多线程编程的基本概念,C++标准库中的多线程支持(std::thread,std::async),如何处理线程同步
    多线程编程在现代计算机系统中非常重要,因为它能够使程序同时执行多个操作,提高计算效率。以下是多线程编程的基本概念及如何在C++标准库中使用std::thread和std::async进行多线程编程,同时处理线程同步和并发问题。多线程编程的基本概念线程(Thread):线程是一个轻量级的进程,是......
  • selenium14_POM设计模式
    Python+Selenium+Unittest+Git+Jenkins框架,POM设计模式1.common文件夹:二次封装原有方法的文件base.py;存放通过的文件,如:生成报告的文件2.pages文件夹:page元素的定位;调用前边的封装方法,或者继承,再次封装一些页面的操作方法:如输入用户名密码点击登陆等操作。(或者元素定位,操作......
  • 用C++解决编程题目:求特殊自然数
    学习目标:用C++编写简单的程序学习内容:#include<iostream>usingnamespacestd;intmain(){ inta,b,c; for(a=1;a<7;a++){ for(b=0;b<7;b++){ for(c=1;c<7;c++){ if(a*7*7+b*7+c==c*9*9+b*9+a){ cout<<a*7*7+b*7+c<<endl; cout<......
  • 抽象工厂模式
    文章目录抽象工厂模式案例代码定义多个产品以及多个实现类定义抽象工厂以及多个的子类工厂客户端使用输出结果抽象工厂模式定义个抽象父类,抽象父类中定义一个抽象的创建对象的方法,然后由子类来创建一系列相关的产品或者依赖簇,不同于工厂方法适用于单个产品。案例......
  • 采用Java语言+开发工具 Idea+ scode数字化产科管理平台源码,产科管理新模式
    采用Java语言+开发工具Idea+scode数字化产科管理平台源码,产科管理新模式数字化产科管理系统是现代医疗信息化建设的重要组成部分,它利用现代信息技术手段,对孕产妇的孕期管理、分娩过程及产后康复等各个环节进行数字化、智能化管理,以提升医疗服务质量和效率;以下是对数字化......
  • IDA7.7 使用IDAPython搜索指定模式的二进制数据方法
    新版的ida弃用了idc.find_binary推荐使用ida_bytes.bin_search方法。ida_bytes.bin_search需要和ida_bytes.parse_binpat_str配合使用。ida_bytes.parse_binpat_str的功能类似于对正则表达式进行编译。ida_bytes.parse_binpat_str官方文档importida_bytesimportidaapiimpo......
  • 图解CPU的实模式与保护模式
    作者:小牛呼噜噜大家好,我是呼噜噜,由于x86保护模式是比较复杂晦涩的,所以特地单拉出来,实模式和保护模式一个重要的更新就是对内存的管理与保护,并且随着软件的发展,为了极致地压榨CPU的性能,硬件和软件都做出了许多努力,为了更好的管理内存,引入分段,分页,段页等等。本文会沿着内存的主......
  • C/C++ 比较运算的注意事项
    C/C++中比较运算是一个基础且重要的概念,它用于比较两个或多个表达式的值,并返回一个布尔结果(在C/C++中以整数形式表示,真为1,假为0)。以下是一些关于C/C++比较运算的注意事项:1.比较运算符C/C++中的比较运算符包括:==(等于)!=(不等于)<(小于)>(大于)<=(小于等于)>=(大于等于)这......
  • java设计模式(十二)享元模式(Flyweight Pattern)
    1、模式介绍:        享元模式是一种结构型设计模式,旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态(可共享)和外部状态(不可共享)来减少内存消耗和提高性能。内部状态存储在享元对象内部,而外部状态则由客户端代码管理和传递。2、应用场景:......
  • 汽车站车票管理系统(C++版)
    设计要求程序菜单功能一个汽车站每天有n班通往各地的车,每班车都有唯一的车次号(00100,00101,00102,…),发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量等信息。每班车信息如下:表1.汽车站汽车数据库列表车次                    ......