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

软件设计模式概述

一        软件模式概述

软件设计模式是在软件开发过程中经过验证的、可重复使用的最佳实践。

它们提供了解决常见设计问题的模板和指导方针,有助于开发人员编写高质量、可维护和可扩展的代码。

软件设计模式通常基于面向对象的编程范式,并利用封装、继承和多态等特性来实现设计目标。

它们提供了一种高级的抽象层次,使开发人员可以关注问题的本质,而不是低级的实现细节。

1.1        设计模式设计原则

设计模式的基本原则包括以下几个:

  • 1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起它变化的原因。即一个类应该有且只有一个职责,避免类承担过多的职责,提高代码的可维护性和可扩展性。
  • 2. 开放封闭原则(Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该是可扩展的,但是不可修改的。即对于新增功能应通过扩展已有的代码来实现,而不是修改已有的代码。
  • 3. 里氏替换原则(Liskov Substitution Principle,LSP):子类型必须能够完全替换掉它们的基类型。即子类必须能够在不影响程序正确性的前提下替换掉父类。
  • 4. 依赖倒置原则(Dependency Inversion Principle,DIP):依赖于抽象而不是具体。高层模块不应该依赖于底层模块,它们都应该依赖于抽象。
  • 5. 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。
  • 6. 迪米特法则(Law of Demeter,LoD):一个对象应该对其他对象有尽可能少的了解。一个对象应该只与它的直接朋友通信,而避免和非直接朋友通信。

二         软件模式分类

常见的软件设计模式包括:

2.1         创建型模式

2.1.1        概述

用于创建对象

2.1.2        种类

单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式

2.1.2.1        单例模式

单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。

单例模式的实现方式有多种,其中比较常见的有以下三种:

  1. 饿汉式:在类加载时就创建实例,并通过静态方法返回该实例。这种方式简单直接,但是无法实现延迟加载。如果该实例在整个程序运行周期中都不会被使用,则会造成资源的浪费。

  2. 懒汉式:在第一次使用时创建实例,并通过静态方法返回该实例。这种方式实现了延迟加载,但是在多线程环境下需要考虑线程安全问题。

  3. 双重锁检查:在懒汉式的基础上加入了双重锁检查,以解决多线程环境下的线程安全问题。它通过使用 synchronized 关键字来保证只有一个线程能够进入临界区创建实例。

2.1.2.2        工厂模式

工厂模式是设计模式中的一种,它提供了一种创建对象的方式,将对象的创建逻辑与使用逻辑分离,从而降低耦合性。

工厂模式的核心思想是定义一个接口或抽象类作为工厂类的工厂方法,具体的对象的创建交给具体的工厂类来实现。

工厂类根据客户端的需求,创建相应的对象并返回。

工厂模式的实现方式有多种,其中常见的有以下几种:

  1. 简单工厂模式:通过一个工厂类来创建对象,客户端只需要告诉工厂类所需的产品类型即可。工厂类根据客户端的需求,创建相应的产品对象并返回。

  2. 工厂方法模式:将对象的创建交给具体的工厂类来实现,每个具体的工厂类只负责创建一个具体的产品对象。客户端通过调用具体的工厂类来获取所需的产品对象。

  3. 抽象工厂模式:通过定义一组相关的工厂类来创建对象,每个工厂类负责创建一组产品对象。客户端通过调用抽象工厂类来获取所需的产品对象。

优点:将对象的创建和使用分离,降低了耦合性;可以通过扩展工厂类来创建更多的产品对象;对客户端隐藏了具体的实现细节。

缺点:如增加了系统的复杂度、需要额外的工厂类等。

2.1.2.3       建造者模式

建造者模式将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式的核心思想是通过一个指导者(Director)和多个具体建造者(Builder)来创建复杂对象。

指导者负责指导建造过程,而具体建造者负责实际的构建工作。客户端只需要告诉指导者所需的产品类型,由指导者来协调和调用具体建造者完成构建。

建造者模式的主要角色有:

1. 产品(Product):要创建的复杂对象。

2. 抽象建造者(Builder):规定了产品的构建过程,包括创建和装配各个组成部分的方法。

3. 具体建造者(Concrete Builder):实现抽象建造者接口,负责具体产品的构建和装配。

4. 指导者(Director):负责指导建造过程,根据客户端的需求调用具体建造者的方法来构建产品。

优点:将复杂对象的构建过程与其表示分离,使得构建过程可以独立地变化;可以更加精细地控制对象的构建过程;可以通过一步一步地构建来创建不同的表示。

缺点:如增加了系统的复杂度、需要额外的建造者类等。

2.1.2.4        原型模式

2. 2        结构型模式

2.2.1        概述

用于描述如何将类和对象组合成更大的结构。

2.2.2         种类

适配器模式、代理模式、桥接模式、装饰器模式、外观模式、享元模式和组合模式。

2.2.2.1        适配器模式
2.2.2.2        代理模式
2.2.2.3        桥接模式
2.2.2.4        装饰器模式
2.2.2.5        外观模式
2.2.2.6        享元模式
2.2.2.7        组合模式

2.3         行为型模式

2.3.1        概述

用于描述对象之间的通信和协作关系。

2.3.2        种类

观察者模式、策略模式、模板方法模式、迭代器模式、命令模式、备忘录模式、状态模式、访问者模式和解释器模式。

2.3.2.1        观察者模式
2.3.2.2        策略模式
2.3.2.3        模板方法模式
2.3.2.4        迭代器模式
2.3.2.5        命令模式
2.3.2.6        备忘录模式
2.3.2.7        状态模式
2.3.2.8        访问者模式
2.3.2.9        解释器模式

三        设计模式优缺点

3.1        优点

使用设计模式可以使代码更具可读性和可维护性,同时也可以提高代码的复用性和可扩展性。

3.2        缺点

过度使用设计模式也可能导致代码变得过于复杂,因此在选择和实施设计模式时需要谨慎考虑。

相关文章:

软件设计模式概述

一 软件模式概述 软件设计模式是在软件开发过程中经过验证的、可重复使用的最佳实践。 它们提供了解决常见设计问题的模板和指导方针,有助于开发人员编写高质量、可维护和可扩展的代码。 软件设计模式通常基于面向对象的编程范式,并利用封装、…...

短剧片源火爆,千金难求好剧源

前言 在当今快节奏的生活中,短剧以其精悍的篇幅、吸睛的剧情和便捷的观看方式,异军突起,吸引了大量观众的关注和喜爱。这些短剧不仅让人们在忙碌的间隙轻松娱乐,更以其高潮迭起的情节设计,让观众在短时间内便能体验到…...

MES系统定制 | 生产调度车间排班计划/MES排程排产

MES系统是一种集成化的生产信息化管理系统,通过实时收集和分析车间生产数据,帮助企业实现生产过程的自动化控制和监测。它可以跟踪生产计划、设备状态、物料流动等关键指标,并提供实时报表和决策支持。在这个系统中,车间班次排班是…...

【Anaconda】 anaconda常用命令总结

【Anaconda】 anaconda常用命令总结 一、创建虚拟环境二、激活/使用/进入某个虚拟环境三、退出当前环境四、复制某个虚拟环境五、删除某个环境六、查看当前所有环境七、查看当前虚拟环境下的所有安装包八、安装或卸载包(进入虚拟环境之后)九、分享虚拟环境十、源服务…...

VIsio Professional 绘图

...

Flutter InAppWebView Unknown feature SUPPRESS_ERROR_PAGE

在使用InAppWebView的initialData加载html代码的时候,出现java.lang.RuntimeException: Unknown feature SUPPRESS_ERROR_PAGE的出错误 E/MethodChannel#flutter/platform_views(16853): Failed to handle method call E/MethodChannel#flutter/platform_views(16853):<...

linux系统PXE自动装机和无人值守

一、PXE 1.PXE&#xff1a;c/s模式&#xff0c;允许客户端通过网络从远程服务器&#xff08;服务端&#xff09;下载引导镜像&#xff0c;加载安装文件&#xff0c;实现自动化安装操作系统。&#xff08;c/s客户端和服务端都可以是多台&#xff09; 2.PXE优点&#xff1a;规模…...

大模型的高考数学成绩单:及格已经非常好了

让考生头皮发麻的高考数学&#xff0c;可难倒了顶尖 AI 大模型。 一年一度的高考即将落幕&#xff0c;衷心希望各位考生都超常发挥&#xff0c;考出满意的好成绩&#xff01;&#xff01; 和往年一样&#xff0c;除了让 AI 大模型写写高考作文&#xff0c;我们也选取了六家国…...

【漏洞复现】CraftCMS ConditionsController.php 代码执行漏洞(CVE-2023-41892)

0x01 产品简介 Crat CMS是一个开源的内容管理系统&#xff0c;它专注于用户友好的内容创建过程&#xff0c;逻辑清晰明了&#xff0c;是一个高度自由&#xff0c;高度自定义设计的平台&#xff0c;可以用来创建个人或企业网站也可以搭建企业级电子商务系统。 0x02 漏洞概述 …...

代码随想录算法训练营第三十八 |● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

我在每一个算法开始之前都会去认真的看一下这个理论基础&#xff0c;或者说是算法的主要思想&#xff0c;可以直接看视频carl讲解的很清晰&#xff1b;其次还会大致看一下这一part中的题型及难度 动态规划理论基础讲解链接&#xff1a;https://programmercarl.com/%E5%8A%A8%E6…...

如何有效处理服务器后台密码暴露

服务器后台密码的暴露是信息安全领域中的严重事件&#xff0c;它可能引发未经授权的数据访问、恶意软件植入或系统功能滥用等一系列问题。本文将探讨几种处理服务器后台密码暴露的有效策略&#xff0c;包括紧急响应步骤、密码安全增强措施及长期预防机制&#xff0c;并提供实际…...

使用本地大模型调用代码,根本就是一场骗局!

通过大模型调用其他工具到底可不可行&#xff1f;ChatGPT 或许能轻松搞定一切&#xff0c;但同样的需求落在本地大模型上&#xff0c;恐怕就要打个问号了。 法国开发工程师 Emilien Lancelot 尝试了多款号称具备工具调用功能的 agent 框架&#xff0c;来看看本地大模型到底能不…...

一些简单却精妙的算法

文章目录 1.树状数组2.红黑树3.星星打分4.欧几里得算法5.快速幂6.并查集 在编程的世界里&#xff0c;简洁的代码往往隐藏着深邃的智慧。一起来看看那些看似简单&#xff0c;实则精妙绝伦的代码片段&#xff0c;体会编程语言的优雅与力量。 1.树状数组 int lowbit(int x) { …...

git多账号使用报错:You don‘t have permissions to push to “xxx/xxxx“ onGitHub. Would

git多账号使用报错&#xff1a;You don’t have permissions to push to “xxx/xxxx” onGitHub. Would 有的时候我们有两个甚至多个git账号&#xff08;公司的git账号和自己的github&#xff09;&#xff0c;为了不混淆提交&#xff0c;我们需要在提交之前查看自己的git账号必…...

中国电子学会(CEIT)2023年12月真题C语言软件编程等级考试三级(含详细解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案) C语言软件编程等级考试三级 2023年12月 编程题五道 总分:100分一、因子问题(20分) 任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。 时间限制: 10000ms 内存限制: 65536kb 输入 包括两个整…...

多线程爬取百度图片

爬取网页图片 import urllib.parse import requests import os import time from concurrent.futures import ThreadPoolExecutorheaders {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0…...

RK3568-修改fiq-debugger调试串口

瑞芯微SDK默认将uart2_m0作为调试串口,以下方法将调试串口修改为uart5_m1。修改bootloader 修改/OK3568-linux-source/rkbin/tools/ddrbin_param.txt文件,5表示串口5。1表示复用m1。执行./ddrbin_tool ddrbin_param.txt ../bin/rk35/rk3568_ddr_1560MHz_v1.11.bin命令修改ub…...

我们离成功有多远呢?只要能完成自己阶段性的目标就算是一次成功

做起一个账号&#xff0c;带好一个团队&#xff0c;经营好一家公司&#xff0c;似乎这些都能叫成功&#xff0c;成功的定义可大可小&#xff0c;而我认为只要能完成自己阶段性的目标就算是一次成功&#xff0c;毕竟每个人学历、背景、阅历、资源、认知都不同&#xff0c;很难同…...

Golang 避坑指南

文章目录 1. Channel 与 Goroutine 泄露1.1 发送不接收1.2 接收不发送1.3 nil channel2. 跳出 for-switch 或 for-select 3.for 迭代变量3.1 闭包中的for迭代变量3.2 for range 迭代变量 4. 循环内的 defer5.defer 函数的参数值6.nil interface 和 nil interface 值7.结构体指针…...

Java核心: JarIndex的使用

在讲解Java类加载器的时候&#xff0c;我们发现URLClassLoader加载类或资源时通过访问ClassPath下的每一个路径&#xff0c;来确定类是否存在的&#xff0c;假设我们执行的命令是这样的 java -classpath D:\DiveInSpring\target\classes;C:\lib\spring-expression.jar;C:\lib\…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...