当前位置: 首页 > 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\…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...