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.mzph.cn/pingmian/40990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

概率论与数理统计_上_科学出版社

contents 前言第1章 事件与概率1.1 随机事件与样本空间1.1.1 样本空间1.1.2 随机事件1.1.3 事件之间的关系与运算 1.2 概率的三种定义及其性质1.2.1 概率的统计定义1.2.2 概率的古典定义1.2.3 概率的几何定义1.2.4 概率的性质 1.3 常用概型公式1.3.1 条件概率计算公式1.3.2 乘法…

百日筑基第十一天-看看SpringBoot

百日筑基第十一天-看看SpringBoot 创建项目 Spring 官方提供了 Spring Initializr 的方式来创建 Spring Boot 项目。网址如下&#xff1a; https://start.spring.io/ 打开后的界面如下&#xff1a; 可以将 Spring Initializr 看作是 Spring Boot 项目的初始化向导&#xff…

【数智化人物展】数势科技创始人兼CEO黎科峰:数智化时代To B软件行业面临颠覆与重塑...

黎科峰 本文由数势科技创始人兼CEO黎科峰投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 2020年&#xff0c;对我而言&#xff0c;是职业生涯中的一个重大转折点。在全球新…

FPGA/数字IC复习八股

一、FPGA概念&#xff0c;与数字IC的区别 二、FPGA底层逻辑 三、同步电路、异步电路以及优缺点 四、同步复位、异步复位、异步复位同步释放 深入理解复位---同步复位&#xff0c;异步复位&#xff0c;异步复位同步释放(含多时钟域&#xff09;_画出支持异步复位dff的电路图…

CourseDetail

目录 1、 CourseDetail.cshtml 1.1、 Content body start 1.2、 <!-- row --> 1.3、 Content body end CourseDetail.cshtml@{Layout = "_Admin

使用css,让div消失在视野中的方法

使用css&#xff0c;让div消失在视野中的方法 display: none;visibility: hidden;opacity:0;通过定位隐藏元素通过margin隐藏元素 display: none; display:none是彻底消失&#xff0c;不在文档流中占位&#xff0c;浏览器也不会解析该元素&#xff1b; 如果给一个元素设置了d…

频域信号通过逆傅里叶变换恢复成时域信号

频域信号通过逆傅里叶变换恢复成时域信号 flyfish import numpy as np import matplotlib.pyplot as plt from scipy.fftpack import fft, ifft plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False# 设置参数 t np.linspace(0, 1, 1000, en…

Google XTS 问题解决 | Android 设备认证

XTS介绍 https://source.android.com/docs/compatibility/cts?hlzh-cn CTS (Compatibility Test Suite) &#xff1a; 兼容性测试套件&#xff0c;主要 google 为保证 Android 核心接口功能的 兼容性。GTS &#xff08; google test suite &#xff09;&#xff1a; Google…

pytorch pnnx repvit模型转换

先把模型转到libtorch #!/usr/bin/env python3 # -*- coding:utf-8 -*- import argparse import time import sys import os import torch import torch.nn as nn import torch.backends.cudnn as cudnn from timm.models import create_model import time import modelinput_…

Django权限系统如何使用?

Django的权限系统是一个强大而灵活的特性&#xff0c;允许你控制不同用户对应用程序中资源的访问。以下是使用Django权限系统的几个基本步骤&#xff1a; 1. 定义模型权限 在你的models.py文件中&#xff0c;你可以为每个模型定义自定义权限。这通过在模型的Meta类里设置perm…

Simulink中示波器连续运行的方法

1.在Simulink中,经常要使用到示波器,默认示波器是定时运行的,只能观察到一小部分运行的波形;实际调试过程中,经常要连续运行,因此,需要设置示波器为连续运行模式,下面将介绍示波器连续运行的方法。 打开Simulink仿真软件,找到仿真设置按钮,点击设置: 2.将其停止时间…

实现一个优雅的 jsBridge 方案

实现一个优雅的 jsBridge 方案 在 iOS 项目中&#xff0c;有时需要实现 JavaScript 和 Native 代码之间的通信。本文介绍一种优雅的 jsBridge 实现方案&#xff0c;支持互相调用和回调机制&#xff0c;并附带详细的代码和注释。 步骤 1: 定义桥接协议 首先&#xff0c;定义一…

音频流格式启用数据流

音频流格式启用数据流 音频流格式启用数据流使用 AudioStreamBasicDescription 结构在哪里以及如何设置流格式 音频流格式启用数据流 在单个样本帧级别处理音频数据时&#xff0c;就像使用音频单元一样&#xff0c;仅仅指定正确的数据类型来表示音频是不够的。单个音频样本值中…

Vuetify3:Vuetify3 + Nuxt3时 tabs 跳转页面

在一开始没去看vuetify3的文档直接使用了nuxt3跳转方式 <template><v-tabs><NuxtLink :to"/yourRouter"><v-tab to"/tab1">Tab 1</v-tab></NuxtLink><v-tab to"/tab2"><NuxtLink :to"/yourR…

升级confluence中的内嵌tomcat

步骤&#xff1a; 1、下载新版本tomcat 下载地址&#xff1a;https://tomcat.apache.org/download-90.cgi 2、关闭confluence 进入confluence的bin目录&#xff0c;执行./stop-confluence.sh 3、备份confluence 在对应目录下&#xff0c;执行 cp ./confluence -r ./conflu…

HandlerMethodArgumentResolver :深入spring mvc参数解析机制

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; 搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到三十…

编程新纪元:AI辅助工具豆包Marscode体验

自从ChatGPT带动全球AI热潮&#xff0c;AI席卷着各行各业。编程界也不例外&#xff0c;早期做过了Github Copilot、阿里的通义灵码等AI编程插件的体验 p.s.以上的下载量与评分均只是plugins.jetbrains的marketplace数据&#xff0c;仅供参考 基本AI编程工具的功能都差不多&…

目标检测中的mAP计算:深入解析与实践指南

目标检测中的mAP计算&#xff1a;深入解析与实践指南 在目标检测任务中&#xff0c;评估模型性能是一个复杂的过程&#xff0c;因为需要同时考虑检测的准确性和召回率。平均精度均值&#xff08;mean Average Precision&#xff0c;简称mAP&#xff09;是一个广泛使用的评估指…

自然语言处理学习(3)RNN 模型学习---NLP领域的第一个模型

一 基本定义 视频链接 1.小案例理解–语义理解 目的&#xff1a;输入一句话&#xff0c;机器需要理解这句话的语义 二. RNN模型分类 1. 按照输入输出分类 (1) N Vs N (2) N Vs 1 (3) 1 VsN (4) seq2seq 三 传统RNN模型 1. 内部结构分析 &#xff08;a) 总体外…

基于单片机的多功能电子时钟的设计

摘要&#xff1a;提出了一种基于单片机的多功能电子时钟的设计方法&#xff0c;以 AT89C52单片机作为系统的主控芯片&#xff0c;采用DS1302作为时钟控制芯片&#xff0c;实现日期时钟显示并且提供精准定时的功能。此外&#xff0c;还可经由DHT22所构成的温湿度传感电路&#x…