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

新手也能懂的SSRF漏洞实战:用iwebsec靶场复现文件读取与内网探测

从零开始掌握SSRF漏洞&#xff1a;iwebsec靶场实战指南1. 认识SSRF漏洞的本质想象一下&#xff0c;你正在一家高档餐厅点餐&#xff0c;服务员承诺可以帮你从任何地方获取食材——包括隔壁竞争对手的厨房。SSRF&#xff08;Server-Side Request Forgery&#xff09;漏洞就像这个…...

ARMv8 HFGITR_EL2寄存器解析与虚拟化指令陷阱控制

1. AArch64 HFGITR_EL2寄存器架构解析HFGITR_EL2&#xff08;Hypervisor Fine-Grained Instruction Trap Register&#xff09;是ARMv8架构中专门用于指令级陷阱控制的系统寄存器&#xff0c;属于虚拟化扩展的重要组成部分。这个64位寄存器通过位映射机制实现对特定AArch64指令…...

政企数据安全:危机与出路

随着数字化转型的浪潮席卷全球&#xff0c;公共部门积累的数据量呈爆炸式增长。从公民个人信息到公共服务记录&#xff0c;从财政预算到基础设施管理数据——这些宝贵资源在提升政府治理效率的同时&#xff0c;也悄然成为网络犯罪分子的“新猎物”。当公共数据逐渐成为数字时代…...

如何快速掌握开源UE资产编辑器:UAssetGUI完整配置与实战指南

如何快速掌握开源UE资产编辑器&#xff1a;UAssetGUI完整配置与实战指南 【免费下载链接】UAssetGUI A tool designed for low-level examination and modification of Unreal Engine game assets by hand. 项目地址: https://gitcode.com/gh_mirrors/ua/UAssetGUI UAss…...

为Claude Code配置稳定API源并解决访问限制

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Claude Code配置稳定API源并解决访问限制 Claude Code 作为一款强大的 AI 编程辅助工具&#xff0c;其原生服务在某些情况下可能…...

Claude SWOT分析(内部风控文档流出版):3类高危使用场景+2个监管红线预警

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Claude SWOT分析&#xff08;内部风控文档流出版&#xff09;&#xff1a;3类高危使用场景2个监管红线预警 高危使用场景识别 在企业级AI应用中&#xff0c;Claude模型若未经严格风控适配&#xff0c;…...

TVA注意力层INT8量化配置技巧

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

C语言(12) 指针的常见操作

指针的常见操作指针变量&#xff0c;有两方面的意思:一个指针指向的内容(数据值&#xff0c;一级)指针变量本身存储的数据 (地址值)#include <stdio.h>int main() {int a 10;int b 0 ;int c 50;int *p NULL;int *q NULL;p &a; // 对指针变量本身进行修改// 对指…...

XXPermissions:Android权限管理框架的架构设计与最佳实践

XXPermissions&#xff1a;Android权限管理框架的架构设计与最佳实践 【免费下载链接】XXPermissions Android Permissions Framework, Adapt to Android 16 项目地址: https://gitcode.com/GitHub_Trending/xx/XXPermissions 在Android应用开发中&#xff0c;权限管理一…...

纯硬件实现I2C协议:从逻辑门到传感器通信的深度实践

1. 项目概述&#xff1a;用纯硬件“解剖”I2C总线很多朋友在玩传感器&#xff0c;尤其是温湿度传感器时&#xff0c;都绕不开I2C这个通信协议。市面上绝大多数的教程和方案&#xff0c;都会告诉你&#xff1a;找个单片机&#xff08;比如Arduino、STM32&#xff09;&#xff0c…...