【设计模式篇】设计模式3类23种

news2025/1/11 7:45:28

创建型模式

 

创建型模式提供了创建对象的机制, 能够提升已有代码的灵活性和可复用性。

 

 

这里面比较重要和经常用到时单例模式、工厂模式和原型模式。

单例模式

单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。

 在java中实现单例模式的最佳手段时静态内部类模式,利用内部类的特性来保证懒加载,由类加载器来保证并发时的线程安全。

工厂方法

工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。

乍看之下, 这种更改可能毫无意义: 我们只是改变了程序中调用构造函数的位置而已。 但是, 仔细想一下, 现在你可以在子类中重写工厂方法, 从而改变其创建产品的类型。

实际上时对java多态的非常好的体现

以下示例演示了如何使用工厂方法开发跨平台 UI (用户界面) 组件, 并同时避免客户代码与具体 UI 类之间的耦合。

基础对话框类使用不同的 UI 组件渲染窗口。 在不同的操作系统下, 这些组件外观或许略有不同, 但其功能保持一致。 Windows 系统中的按钮在 Linux 系统中仍然是按钮。

但是有可能不同操作系统也不一样,简单来说工厂生产单一对象,抽象工厂生产多种对象,所以需要再抽象一下,这样抽象工厂出现了。

  • 在许多设计工作的初期都会使用工厂方法模式 (较为简单, 而且可以更方便地通过子类进行定制), 随后演化为使用抽象工厂模式、 原型模式或生成器模式 (更灵活但更加复杂)。

跨平台应用中的相同 UI 元素功能类似, 但是在不同操作系统下的外观有一定差异。 此外, 你需要确保 UI 元素与当前操作系统风格一致。 你一定不希望在 Windows 系统下运行的应用程序中显示 macOS 的控件。

 原型模式

定义:指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。不需要知道任何创建的细节,不调用构造函数

适用场景:类初始化消耗较多资源。new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)。构造函数比较复杂。循环体中产生大量对象时。

优点:原型模式比 new 方法创建对象的性能要好得多,因为 Object 类的 clone() 方法是一个本地方法,直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显

缺点:必须配备克隆方法。对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险。深拷贝、浅拷贝要运用得当。

对于我们来说只是换了个构造方法,实际上生活中用的很少。

结构型:不兼容结构的协调

 

装饰模式

定义:装饰是一种结构设计模式, 允许你通过将对象放入特殊封装对象中来为原对象增加新的行。(就是俄罗斯套娃)

优点:继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能。通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同的效果。符合开闭原则。

缺点:会出现更多的代码,更多的类,增加程序复杂性。动态装饰时,多层装饰时会更复杂。
其实就是对类进行再次封装。

代理模式

代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理(AOP就是一种代理,spring中无处不在的代理)

代理将自己伪装成数据库对象, 可在客户端或实际数据库对象不知情的情况下处理延迟初始化和缓存查询结果的工作。

适用场景:保护目标对象。增强目标对象。

优点:代理模式能将代理对象与真实被调用的目标对象分离。一定程度上降低了系统的耦合度,扩展性好。保护目标对象。增强目标对象。

缺点:代理模式会造成系统设计中类的数目增加。在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。增加系统的复杂度。

  • 装饰和代理有着相似的结构, 但是其意图却非常不同。 这两个模式的构建都基于组合原则, 也就是说一个对象应该将部分工作委派给另一个对象。 两者之间的不同之处在于代理通常自行管理其服务对象的生命周期, 而装饰的生成则总是由客户端进行控制。

适配器模式

适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。

实现时使用了构成原则: 适配器实现了其中一个对象的接口, 并对另一个对象进行封装。 所有流行的编程语言都可以实现适配器。

  • 适配器可以对已有对象的接口进行修改, 装饰模式则能在不改变对象接口的前提下强化对象功能。 此外, 装饰还支持递归组合, 适配器则无法实现。

 

享元模式

享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。

例如 Java 的 String 字符串,在一些字符串常量中,会共享常量池中字符串对象,从而减少重复创建相同值对象,占用内存空间。

与单例的区别:

单例模式是类级别的,一个类只能有一个对象实例;

享元模式是对象级别的,可以有多个对象实例,多个变量引用同一个对象实例;

享元模式主要是为了节约内存空间,提高系统性能,而单例模式主要为了可以共享数据;

原型模式享元模式:

  • 前者是在创建多个实例时,对创建过程的性能进行调优;
  • 后者是用减少创建实例的方式,来调优系统性能。

如数据库连接池或者是上下文模式都是享元模式的引用。简单来说就是利用对象池。

行为模式

责任链模式

责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。

     为完成同一个请求,如果存在多个请求处理器以及未知请求处理器个数或者请求处理器可动态配置的情况下,可以考虑使用责任链模式。

责任链模式优点:

耦合度低,请求者和执行者并没有必然的联系;
灵活度高,可以通过内部成员来进行更改它们执行的次序;
扩展性好,Handler的子类扩展非常方便。

责任链模式缺点:

会在某程度上降低程序的性能,设置不当的话可能会出现循环调用。
在链过长时,会降低代码的阅读性以及增加代码的复杂度。

使用场景:

需要动态指定处理某一组请求时,在不确定接受者的的情况下,向多个对象发送请求时。

spring - 设计模式之责任链模式 - 个人文章 - SegmentFault 思否

命令模式

命令模式是一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。

命令模式优点:

耦合度低,请求者和执行者并没有必然的联系;
扩展性好,Command的子类可以非常容易地扩展。

命令模式缺点:

如果命令过多的话,会增加系统的复杂度 。

使用场景:

如果在有类似命令需要指定的,就可以用命令模式,比如记录日志、撤销操作命令等。

 

  • 责任链按照顺序将请求动态传递给一系列的潜在接收者, 直至其中一名接收者对请求进行处理。
  • 命令在发送者和请求者之间建立单向连接。

责任链个人理解:如果程序有一连串的串行操作,可能会用到责任链模式

命令模式个人理解:主要的操作方法是相同的,但是可以通过命令对象指向不同的对象来完成对不同对象的控制,例如遥控控制空调、电视等

备忘录模式

备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

模式建议将对象状态的副本存储在一个名为备忘录 (Memento) 的特殊对象中。 除了创建备忘录的对象外, 任何对象都不能访问备忘录的内容。 其他对象必须使用受限接口与备忘录进行交互, 它们可以获取快照的元数据 (创建时间和操作名称等), 但不能获取快照中原始对象的状态。

观察者模式

亦称: 事件订阅者、监听者、Event-Subscriber、Listener、Observer

观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个“观察” 该对象的其他对象。

访问者模式

访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。

访问者模式建议将新行为放入一个名为访问者的独立类中, 而不是试图将其整合到已有类中。现在, 需要执行操作的原始对象将作为参数被传递给访问者中的方法, 让方法能访问对象所包含的一切必要数据。

  • 你可以将访问者模式视为命令模式的加强版本, 其对象可对不同类的多种对象执行操作

总结:

创建型模式提供了创建对象的机制, 能够提升已有代码的灵活性和可复用性。

结构型模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。结构型模式
行为模式负责对象间的高效沟通和职责委派。

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

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

相关文章

antd 动态增减表单项的使用

需求 首先这是基于antd的Form组件&#xff0c;需求1&#xff1a; 单选按钮组 选择设置时间 展示时间选择器需求2&#xff1a; 动态添加时间选择器(最多添加10个、时间为空校验、时间段重叠校验)需求3&#xff1a; 开关需求4&#xff1a;编辑时赋值 1. 单选钮组 <Radio.Gro…

4.6.1、路由选择协议概述

1、静态/动态路由 2、主要特点 因特网所采用的路由选择协议的主要特点 例如&#xff1a;一个较大的因特网提供商就可划分为一个自治系统 在自治系统内部和外部采用不同类别的路由选择协议&#xff0c;分别进行路由选择 3、分层次的路由选择协议 如下所示&#xff0c;将网络…

ArcGIS基础实验操作100例--实验44融合细碎多边形

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验44 融合细碎多边形 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

k8s基础

一、基本介绍 Kubernetes&#xff0c;简称K8s&#xff0c;是用8代替8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效(powerful) , Kubernetes提供了应用部署…

Linux 下 python3.9.8的安装

1. 准备安装环境 yum install gcc zlib* openssl* -y 2. linux 下 python 安装包的获取 官网下载地址: https://www.python.org/downloads/ 找到 自己想要的版本。 方式一&#xff1a;直接点击该链接下载&#xff0c;然后将安装包通过xftp 传送到远程服务器 的 /opt 路…

k8s之搭建单机集群

写在前面 本文一起看下如何在单机环境下搭建k8s集群。 基础环境准备参考这篇文章 。 1&#xff1a;k8s的前世今生 现在当我们提到容器技术时&#xff0c;首先想到的肯定是docker&#xff0c;但其实在docker之前&#xff0c;谷歌公司就已经有了类似的技术&#xff0c;我们知道…

借助免费AI艺术平台生成头像

随着 AI 的兴起&#xff0c;看到越来越多的实例通过 OpenAI 的举措变得轻松&#xff0c;使得 AI 艺术在今天早已不是什么新鲜事物&#xff0c;而且在游戏领域也开始有所应用。人工智能&#xff08;AI&#xff0c;artificial intelligence&#xff09;艺术&#xff0c;更准确地说…

数据挖掘与机器学习作业_09 贝叶斯

贝叶斯 贝叶斯公式 后验概率 先验概率 * 似然估计 from sklearn.model_selection import GridSearchCV from sklearn.naive_bayes import BernoulliNB from sklearn.naive_bayes import GaussianNB from sklearn.naive_bayes import MultinomialNB from sklearn.naive_bayes…

关于进程间的通信方式的总结

一、背景 在人类思想史上,马克思第一次对人的本质作出科学界定:人的本质是一切社会关系的总和。时间万物都存在或多或少的关系。那么人除了天生父子这样的家族关系&#xff0c;还有后天 通过 语言 &#xff0c;这样区别于其他动物的方式来进行和其他人的交流产生关系。 在计算…

PTL仓库提货解决方案

电子标签拣货系统是采用先进电子技术和通信技术开发而成的物流辅助作业系统&#xff0c;通常使用在仓储或现代化物流中心分拣环节&#xff0c;具有拣货速度快、效率高、差错率低、无纸化、标准化的作业特点&#xff0c;电子标签辅助拣货系统作为一种先进的作业手段&#xff0c;…

【小程序】如何开发属于自己的一款小程序

文章目录小程序简介概念小程序与普通网页开发的区别微信开发者工具小程序代码构成项目结构JSON 配置文件WXML 模板WXSS 样式JS 逻辑交互小程序的宿主环境宿主环境简介通信模型运行机制组件常用的视图容器类组件常用的基础内容组件其它常用组件API协同工作小程序成员管理小程序的…

数据完整性测试之【三】Redis缓存和数据库表里的记录

本文为博主原创&#xff0c;未经授权&#xff0c;严禁转载及使用。 本文链接&#xff1a;https://blog.csdn.net/zyooooxie/article/details/119377944 前面分享过 接口返回值 和 表记录 的校验 、 导出的CSV、Excel文件 和 表记录 的校验&#xff0c;最近 我们项目常常用到Re…

【大小端问题】

什么是大小端&#xff1f; 为什么存在大小端&#xff1f;如何判断计算机的大小端存储模式&#xff1f; 大小端是什么&#xff1f; 计算机在内存存储中有两中存储模式&#xff1a; 大端字节序存储模式和小端字节序存储模式。 大端存储模式&#xff0c;是指数据的低位保存在内…

API接口测试简介

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是API接口测试简介。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设备…

Hadoop高手之路8-Flume日志采集

文章目录Hadoop高手之路8-Flume日志采集一、Flume概述1. Flume简介2. Flume运行机制3. Flume日志采集系统结构图二、Flume的搭建1. 下载2. 上传3. 解压4. 配置环境变量5. 配置flume三、Flume入门使用1. 配置数据采集方案1) 查看官网2) 案例需求3) 创建新的配置文件4) 复制官网的…

公司业财一体化详解

一、传统财务会计如何手工做账1.没有财务系统&#xff08;软件&#xff09;时公司会计用手工记账&#xff0c;流程包括&#xff1a;建立总账&#xff1b;首先建立账簿&#xff0c;登记会计账簿时&#xff0c;应当将会计凭证日期、编号、业务内容摘要、金额和其他有关资料逐项计…

GAMES101作业5及框架梳理

闲言碎语 emmm&#xff0c;上一次写还是2022年4月份的事情了&#xff0c;真的有点恍如隔世&#xff0c;4月到9月主要是在准备保研的事情&#xff0c;然后10月到12月基本上是在适应实习生活&#xff08;没错&#xff0c;保完研之后因为种种原因就直接开始实习了&#xff0c;害&…

[Vue]Vue3学习笔记(尚硅谷)

文章目录&#x1f97d; 创建Vue3项目&#x1f30a; vue-cli&#x1f30a; vite&#x1f97d; 项目结构&#x1f97d; Vue3开发者工具的安装&#x1f97d; 初识setup&#x1f97d; ref 函数&#x1f97d; reactive函数&#x1f97d;Vue3.0中的响应式原理&#x1f30a; vue2.x的响…

微服务架构解决方案介绍

1、微服务架构 目前微服务是非常火的架构或者说概念&#xff0c;也是在构建大型互联网项目时采用的架构方式。 1.1 单体架构 在软件设计中&#xff0c;经常提及和使用经典的3层模型&#xff0c;即表示层、业务逻辑层和数据访问层。 表示层&#xff1a;用于直接和用户交互&a…

内网穿透(mac,window,linux通用)1分钟实现外网访问电脑本地服务器

我们在做开发时&#xff0c;不想购买服务器&#xff0c;只想搭建我们本地的服务器&#xff0c;我们搭建的本地服务器只能供我们自己电脑的浏览器访问&#xff0c;或者处于同一个wifi下的手机访问&#xff0c;但是我们如果想让别人访问到我们的本地服务器&#xff0c;尤其做微信…