软件设计模式概述

一        软件模式概述

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

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

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

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

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        缺点

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23487.shtml

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

相关文章

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十八)- 微服务(8)

目录 11.4 SpringAMQP 11.4.2 Work Queue工作队列 11.4.3 发布订阅模型 11.4.4 FanoutExchange(广播交换机) 11.4.5 DirectExchange(路由模式交换机) 11.4.6 TopicExchange 11.5 消息转换器 11.4 SpringAMQP 父工程引入AMQP依赖 <!--AMQP依赖&#xff0c;包含RabbitMQ…

【Android面试】Java中静态内部类是什么?和非静态内部类的区别是什么?

文章目录 Java中静态内部类是什么?和非静态内部类的区别是什么?这道题想考察什么?考察的知识点考生应该如何回答什么是内部类,什么是静态内部类?静态内部类非静态内部类静态内部类和非静态内部类的区别静态内部类和普通内部类都有各自的用途和优势扩展一:使用静态内部类来…

接口自动化测试做到什么程度的覆盖算是合格的

接口自动化测试的覆盖程度是一个衡量测试质量与效率的重要指标&#xff0c;其“好”的标准并非绝对&#xff0c;而是根据项目特性和团队需求动态调整的结果。然而&#xff0c;有几个原则和实践可以帮助我们确定一个相对合理的覆盖范围&#xff0c;以及为何这些覆盖是必要的。 1…

鸿蒙全栈开发-一文读懂鸿蒙同模块不同模块下的UIAbility跳转详解

前言 根据第三方机构Counterpoint数据&#xff0c;截至2023年三季度末&#xff0c;HarmonyOS在中国智能手机操作系统的市场份额已经提升至13%。短短四年的时间&#xff0c;HarmonyOS就成长为仅次于安卓、苹果iOS的全球第三大操作系统。 因此&#xff0c;对于鸿蒙生态建设而言&a…

FatFs文件系统移植到MCU平台详细笔记经验教程

0、准备工作 在移植FatFs文件系统前&#xff0c;需要准备好一块开发板&#xff0c;和一张SD卡&#xff0c;且需要已经实现开发板正常的读写SD卡或其它硬件设备。 本文笔记教程中使用的硬件设备是STM32F407VET6开发板&#xff08;板载SD插槽&#xff09;&#xff0c;配备8G和32G…

C#知识|通过ADO.NET实现应用程序对数据库的查询操作。

哈喽,你好啊,我是雷工! 前边学习了通过ADO.NET实现C#应用程序对数据库的增、删、改操作。 接下来接着学习查询操作,以下为学习笔记。 查询返回有两种类型,一种是单行单列的单一结果,一种是结果集,首先了解查询结果是单行单列结果的写法。 01 查询返回单一结果 以前方的…

[AVL数四种旋转详细图解]

文章目录 一.右单旋二. 左单旋三. 右左双旋四. 左右双旋 一.右单旋 新节点插入较高左子树的左侧—左左&#xff1a;右单旋 由于在较高左子树的左侧插入一个节点后&#xff0c;左边插入导致30的平衡因子更新为-1&#xff0c;而60平衡因子更新为-2&#xff0c;此时不平衡&…

RxSwift-数据双向绑定

RxSwift原理: RxSwift 的一些原理解析 | Zacharys blog RxSwift 源码解析03:Observable 核心逻辑 - 简书 RxSwift源码分析(一)-核心逻辑解析 RxSwift 是一个用于 iOS 开发的响应式编程库,它提供了一种声明式的方法来处理异步数据流。双向数据绑定(Two-way Data Binding…

iCloud高效利用

在 iPhone、iPad 或 iPod touch 上为“备忘录”设置 iCloud 在 iPhone、iPad 或 iPod touch 上&#xff0c;前往“设置”> [你的名字] > iCloud。 执行以下任一操作&#xff1a; iOS 16、iPadOS 16 或更高版本&#xff1a;轻点“显示全部”&#xff0c;轻点“备忘录”&a…

五大PS插件推荐,让你的设计效率翻倍!

前言 PS插件可以在繁忙的设计工作中&#xff0c;帮助设计师们快速高效地完成任务&#xff0c;是每个设计师都渴望解决的问题。这些插件不仅能够提升设计效率&#xff0c;还能让设计师的创意得到更好的展现。接下来&#xff0c;就为大家推荐五款必备的PS插件&#xff0c;让你的…

AI数字人本地算力直播怎么做?青否数字人教您快速搭建直播间!

一、青否数字人直播分为两种&#xff0c;一种是云端渲染另外一种就是本地渲染 使用本地算力来进行直播间互动&#xff0c;本地算力能够使商家拥有更低成本运营 在独立部署数字人SaaS系统后&#xff0c;其他的数字人厂商是【云服务器】【算力服务器】相结合的方式&#xff0c;以…

动态IP在云计算中的应用与优势(短效IP的作用)

一、云计算概述 云计算是指通过互联网将计算资源和服务提供给用户的一种模式。它具有高灵活性、可扩展性和成本效益等特点&#xff0c;使得企业能够快速响应市场变化&#xff0c;降低IT投入成本。云计算的核心优势在于其资源的动态分配和高效利用。 二、动态IP在云计算中的角…

JDK17语法新增特性(常用)

1、yield 关键字 yield 关键字从Java13开始引入&#xff0c;用于从case的代码块中返回值 示例&#xff1a; 正常的switch语句&#xff1a; public static void main(String[] args) {String data "one";int result 0;//接收数据的返回值switch(data) {case &quo…

2024年计算机、信息工程与大数据应用国际会议(CIEBDA 2024)

2024 International Conference on Computer, Information Engineering, and Big Data Applications 【1】大会信息 会议简称&#xff1a;CIEBDA 2024 大会地点&#xff1a;中国青岛 审稿通知&#xff1a;投稿后2-3日内通知 投稿邮箱&#xff1a;ciebdasub-paper.com 【2】会…

三、【源码】Mapper XML的解析和注册使用

源码地址&#xff1a;https://github.com/mybatis/mybatis-3/ 仓库地址&#xff1a;https://gitcode.net/qq_42665745/mybatis/-/tree/03-parse-mapperXML Mapper XML的解析和注册使用 流程&#xff1a; 1.Resources加载MyBatis配置文件生成Reader字符流 2.SqlSessionFact…

Facechain系列:命令行进行LoRA训练

FaceChain也支持在python环境中直接运行脚本进行训练和推理。为了避免人物肖像的版权问题&#xff0c;文章中使用的图片不是由FaceChain实际生成的图片&#xff0c;特此说明。 在克隆facechain源文件&#xff08;克隆方法可以看这里Facechain系列: 独立安装&#xff09;后的文…

[职场] 质量管理求职简历工作经历范文6篇 #知识分享#经验分享

质量管理求职简历工作经历范文6篇 质量管理是指确定质量方针、目标和职责&#xff0c;并通过质量体系中的质量策划、控制、保证和改进来使其实现的全部活动&#xff0c;EMBA、MBA等主流商管教育均对质量管理及其实施方法有所介绍。下面是质量管理求职简历工作经历范文6篇&…

一种用于异质结高电子迁移率晶体管(HEMTs)的紧凑型漏电流模型,其中包括双子带的二维电子气(2DEG)密度解

来源&#xff1a;A compact drain current model for heterostructure HEMTs including 2DEG density solution with two subbands&#xff08;Solid-State Electronics 16年&#xff09; 摘要 本文提出了一种针对异质结高电子迁移率晶体管(HEMTs)的二维电子气(2DEG)电荷密度…

【ARM Cache 系列文章 7.2 – ARMv8/v9 MMU 页表配置详细介绍 03 】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 表描述符 Table descriptor52-bit OA 颗粒为4KB 和16KB52-bit OA 颗粒为64KB48-bit OA 颗粒为4KB 和16KBStage 1 和 Stage 2 介绍第一阶段(Stage 1)转换的表描述符属性字段第二阶段(…

【Python】教你彻底了解Python中的并发编程

​​​​ 文章目录 一、并发编程的基本概念1. 线程&#xff08;Thread&#xff09;2. 进程&#xff08;Process&#xff09;3. 协程&#xff08;Coroutine&#xff09; 二、Python中的线程与进程1. 线程1.1 创建和启动线程1.2 线程同步 2. 多进程2.1 创建和启动进程2.2 进程间…