当前位置: 首页 > news >正文

23种设计模式之C++实践(一)

23种设计模式之C++实践

  • 1. 简介
  • 2. 基础知识
  • 3. 设计模式
    • (一)创建型模式
      • 1. 单例模式——确保对象的唯一性
        • 1.2 饿汉式单例模式
        • 1.3 懒汉式单例模式
        • 比较
        • IoDH
        • 单例模式总结
      • 2. 简单工厂模式——集中式工厂的实现
        • 简单工厂模式总结
      • 3. 工厂方法模式——多态工厂的实现
        • 工厂方法模式总结
      • 4. 抽象工厂模式——产品族的创建
        • 抽象工厂模式总结
      • 5. 原型模式——对象的克隆
        • 原型模式总结
      • 6. 建造者模式——复杂对象的创组装与创建
        • 建造者模式总结

1. 简介

设计模式是一门技术,更是一门艺术,它为构建可维护性和可复用性俱佳的软件而诞生。

2. 基础知识

  1. 设计模式(Design Pattern):是一套被反复使用的,多数人知晓的,经过分类编目的代码设计经验的总结,使用设计模式是为了可以重用代码,让代码更容易被理解提高代码的可靠性
  2. UML(United Modeling Language)
      1. 关联关系(实线):通常将一个类的对象作为另一个类的成员变量。
        1. 双向关联
        2. 单向关联
        3. 自关联
        4. 多重性关联
      2. 聚合关系(空心菱形直线):成员是整体的一部分,但是成员可以脱离整体存在。通常通过set()函数初始化成员变量。
      3. 组合关系(实心菱形直线):整体控制成员的声明周期,整体不存在,则成员不存在。通常通过构造函数初始化成员变量。
      4. 依赖关系(带箭头虚线):类的改变影响到使用该类的其他类,则其他类依赖该类。通常通过将一个类的对象作为另一个类中方法的参数体现。
      5. 泛化关系/继承关系(空心三角形实线):父类与子类。
      6. 接口与实现关系(空心三角形虚线):在接口类中声明抽象函数,在实现类中实现函数。
  3. 面向对象设计原则
    1. 单一职责原则(Single Responsibility):一个类只负责一个功能领域中的相应职责。或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。高内聚,低耦合
    2. 开闭原则(Open-Closed Principle,OCP):一个软件实体应该对外扩展开放,对修改关闭。即软件实体尽量在不修改原有代码的基础下进行扩展。抽象化
    3. 里氏代换原则(Liskov Substitution Principle,LSP):所有引用父类的地方必须能透明地使用其子类的对象。父类抽象化
    4. 依赖倒转原则(Dependency Inversion Principle,DIP):抽象不应该依赖于细节,细节应该依赖于抽象。即针对接口编程,而不是针对实现编程。参数抽象化
    5. 接口隔离原则(Interface Segregation Principle,ISP):使用多个专用的接口,而不适用单一的总接口,即客户端不应该依赖那些它不需要的接口。
    6. 合成复用原则(Composite Reuse Principle,CRP):尽量使用对象组合,而不是继承来达到复用的目的。
    7. 迪米特法则/最少知识原则(Law of Demeter/Least Knowledge Principle,LoD/LKP):一个软件实体应该尽可能少的与其他实体发生相互作用。

3. 设计模式

(一)创建型模式

1. 单例模式——确保对象的唯一性

  1. 单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,它提供全局访问的方法。

  2. 要点:

    1. 某个类只能有一个实例

    2. 它必须自行创建这个实例

    3. 它必须自行向整个系统提供这个实例

  3. 结构图:

  4. 使用场景实例

    Windows任务管理器

    在一个Windows系统中,任务管理器存在唯一性。

  5. 代码实例

    // TaskManager.h
    class TaskManager {private:/*** @brief 初始化窗口**/TaskManager() {}public:/*** @brief 显示进程**/void displayProcesses();/*** @brief 显示服务**/void displayServices();private:static TaskManager* tm;public:static TaskManager* getInstance();
    };// TaskManager.cpp
    TaskManager* TaskManager::tm = nullptr;void TaskManager::displayProcesses() {printf("显示进程……\n");return;
    }
    void TaskManager::displayServices() {printf("显示服务……\n");return;
    }TaskManager* TaskManager::getInstance() {if (tm == nullptr) {tm = new TaskManager();}return tm;
    }
    
  6. 代码测试

    • 测试代码:

      int main(int argc, char** argv) {printf("I'm Singleton Pattern!\n");// begin testSingleTonNS::TaskManager* tm = SingleTonNS::TaskManager::getInstance();tm->displayProcesses();tm->displayServices();// end testreturn 0;
      }
      
    • 输出

      I’m Singleton Pattern!
      显示进程……
      显示服务……

1.2 饿汉式单例模式
  1. 饿汉式单例模式(Eager Singleton):在定义静态变量的时候实例化单例类,因此在类加载时就已经创建了单例对象

  2. 结构图

  3. 代码示例

     // TaskManager.hclass TaskManager {private:/*** @brief 初始化窗口**/TaskManager() {}public:/*** @brief 显示进程**/void displayProcesses();/*** @brief 显示服务**/void displayServices();private:static TaskManager* tm;public:static TaskManager* getInstance();};// TaskManager.cpp// 饿汉式单例模式初始化TaskManager* TaskManager::tm = new TaskManager();void TaskManager::displayProcesses() {printf("显示进程……\n");return;}void TaskManager::displayServices() {printf("显示服务……\n");return;}TaskManager* TaskManager::getInstance() {return tm;}
    
1.3 懒汉式单例模式
  1. 见单例模式实现方式。
比较
  1. 饿汉式单例类

    • 优点

      1. 无需考虑多线程访问问题,可以确保实例的唯一性

      2. 调用速度与反应时间更快

    • 缺点

      1. 资源利用效率更低

      2. 加载时间更长

  2. 懒汉式单例类

    • 优点
      1. 延迟加载,无需一直占用系统资源
    • 缺点
      1. 必须处理好多线程同时访问的问题,可能引起性能受影响
IoDH
  1. 有没有一种方法,能够将两种单例的缺点都克服,而将两者的优点合二为一呢?答案是肯定的,即Initialization on Demand Holder技术
  2. IoDH:在单例类中增加一个静态内部类,在该内部类中,创建单例对象,再将该单例对象通过getInstance()方法返回给外部使用。
  3. 使用IoDH,既可以实现延迟加载,又可以保证线程安全,不影响系统性能,但是与编程语言本身的特性相关,很多面向对象语言不支持IoDH,例如C++。支持的语言有Java。
单例模式总结
  • 优点
    1. 提供了对唯一实例的受控访问。
    2. 节约系统资源
    3. 允许可变数目的实例。
  • 缺点
    1. 没有抽象层,扩展较为困难
    2. 职责过重,一定程度上违反了单一职责原则。
    3. 很多面向对象语言(例如Java,C#)的运行环境都提供了自动垃圾回收技术,因此,如果实例化的共享对象长期不被利用,会自动销毁并回收资源,下次利用时重新实例化,这将导致共享的单例对象状态的丢失。
  • 适用场景
    1. 系统只需要一个实例对象
    2. 客户调用类的单个实例只允许使用一个公共访问点。

2. 简单工厂模式——集中式工厂的实现

  1. 简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建类的实例通常具有共同的父类。

  2. 要点:

    1. 当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。
  3. 结构图:

  4. 适用场景实例

    图标库:为应用系统提供各种不同外观的图表,例如柱状图、饼状图、折线图等等

  5. 代码示例

// Chart.h
/*** @brief 图表类接口**/
class Chart {public:virtual void display() = 0;
};/*** @brief 柱状图**/
class HistogramChart : public Chart {public:HistogramChart();void display() override;
};/*** @brief 饼状图**/
class PieChart : public Chart {public:PieChart();void display() override;
};/*** @brief 折线图**/
class LineChart : public Chart {public:LineChart();void display() override;
};// ChartFactory.h
class ChartFactory {public:static Chart* getChart(std::string type);
};// Chart.cpp
HistogramChart::HistogramChart() { printf("创建柱状图!\n"); }void HistogramChart::display() {printf("展示柱状图!\n");return;
}PieChart::PieChart() { printf("创建饼状图!\n"); 

相关文章:

23种设计模式之C++实践(一)

23种设计模式之C++实践 1. 简介2. 基础知识3. 设计模式(一)创建型模式1. 单例模式——确保对象的唯一性1.2 饿汉式单例模式1.3 懒汉式单例模式比较IoDH单例模式总结2. 简单工厂模式——集中式工厂的实现简单工厂模式总结3. 工厂方法模式——多态工厂的实现工厂方法模式总结4.…...

华为OD机试 - 园区参观路径(Java JS Python C)

题目描述 园区某部门举办了Family Day,邀请员工及其家属参加; 将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角; 家属参观园区时,只能向右和向下园区前进,求从起始园区到终点园区会有多少条不同的参观路径。 输入描述 第一行为园区的长和宽; 后…...

【ARM Trace32(劳特巴赫) 使用介绍 12 -- Trace32 常用命令之 d.dump | data.dump 介绍】

文章目录 Trace32 常用命令之 d.dump | data.dump 介绍1 字节显示 (Byte)4 字节显示(word)8 字节显示(通常long)十进制显示显示指定列数显示地址范围内的值 Trace32 常用命令之 d.dump | data.dump 介绍 在 TRACE32 调试环境中&a…...

【Git】Git撤销操作

记录一下,方便后续查找,不全,后续再做补充。 丢弃当前工作区未提交的修改 # 丢弃所有修改 git checkout .# 丢弃某个文件修改 git checkout 文件名丢弃本地已经提交的代码 (1)撤销最近一次提交 如果我们在最近一次提…...

改造python3中的http.server为简单的文件上传下载服务

改造 修改python3中的http.server.SimpleHTTPRequestHandler,实现简单的文件上传下载服务 simple_http_file_server.py: # !/usr/bin/env python3import datetime import email import html import http.server import io import mimetypes import os …...

Fiddler抓包工具之fiddler的composer可以简单发送http协议的请求

一,composer的详解 右侧Composer区域,是测试接口的界面: 相关说明: 1.请求方式:点开可以勾选请求协议是get、post等 2.url地址栏:输入请求的url地址 3.请求头:第三块区域可以输入请求头信息…...

14、pytest像用参数一样使用fixture

官方实例 # content of test_fruit.py import pytestclass Fruit:def __init__(self, name):self.name nameself.cubed Falsedef cube(self):self.cubed Trueclass FruitSalad:def __init__(self, *fruit_bowl):self.fruit fruit_bowlself._cube_fruit()def _cube_fruit(s…...

C++ Primer Plus第十三章笔记

目录 基类 构造函数:访问权限的考虑 1.2 派生类和基类之间的特殊关系 继承:is-a关系 多态公有继承 静态联编和动态联编 指针和引用类型的兼容性 虚成员函数和动态联编 虚函数的注意事项 构造函数 析构函数 友元 没有重新定义 重新定义将隐…...

【JavaEE】单例模式

作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文于《JavaEE》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…...

第十五届蓝桥杯模拟赛(第二期 C++)

俺自己做的噢,还未核实答案,若有差错,望斧正。 第一题 小蓝要在屏幕上放置一行文字,每个字的宽度相同。小蓝发现,如果每个字的宽为 36 像素,一行正好放下 30 个字,字符之间和前后都没有任何空隙…...

关于Unity中字典在Inspector的显示

字典在Inspector的显示 方法一:实现ISerializationCallbackReceiver接口 《unity3D游戏开发第二版》记录 在编辑面板中可以利用序列化监听接口特性对字典进行序列化。 主要继承ISerializationCallbackReceiver接口 实现OnAfterDeserialize() OnBeforeSerialize() …...

使用Plex结合cpolar搭建本地私人媒体站并实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…...

svn合并冲突时每个选项的含义

合并冲突时每个选项的含义 - 这个图片是 TortoiseSVN(一个Subversion(SVN)客户端)的合并冲突解决对话框。当你尝试合并两个版本的文件并且出现差异时,你需要解决这些差异。这个对话框提供了几个选项来处理合并冲突&…...

指针、数组与函数例题3

1、字符串复制 题目描述 设计函数实现字符串复制功能,每个字符串长度不超过100,不要使用系统提供的strcpy函数 输入要求 从键盘读入一个字符串到数组b中,以换行符结束 输出要求 将内容复制到另一个数组a中,并分别输出数组a和…...

ThreeJs样例 webgl_shadow_contact 分析

webgl_shadow_contact 官方样例中,对阴影的渲染比较特殊,很值得借鉴,学习渲染阴影的思路;这个例子中对阴影的渲染,并没有使用任何光源,没有用shadowmap的常规方式 渲染阴影;而是使用了深度材质T…...

Nginx(缓冲区)

先来思考一个问题,接入Nginx的项目一般请求流程为:“客户端→Nginx→服务端”,在这个过程中存在两个连接:“客户端→Nginx、Nginx→服务端”,那么两个不同的连接速度不一致,就会影响用户的体验(…...

MQTT协议理解并实践

MQTT是一个轻量的发布订阅模式消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用设计 MQTT协议根据主题来分发消息进行通信,支持通配符匹配,可以低开销的使用数百万Topic进行一对一,一对多双向通信。 协议特点 1. 开放…...

实现一个简单的网络通信下(udp)

时间过去好久了,先回忆一下上一篇博客的代码!! 目前来看,我们客户端发一条消息,我服务器收到这一条消息之后呢,服务器也知道了是谁给我发来的消息,紧接这就把这条消息放进buffer当中&#xff0c…...

Linux中office环境LibreOffice_7.6.2下载

阿里云盘:LibreOffice_7.6.2 使用:下载的文件为exe文件,双击exe文件即可获取到文件 LibreOffice_7.6.2安装: 解压:tar -zxvf LibreOffice_7.6.2_Linux_x86-64_rpm.tar.gz 移动到RPMS目录:cd LibreOffice_7…...

Linux快捷控制

Linux快捷控制 工具安装 yum -y install lrzsz wget curl net-tools git防火墙 systemctl status firewalld.service systemctl stop firewalld.service systemctl disable firewalld.service宝塔 yum install -y wget && wget -O install.sh https://download.bt.…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...