常见的设计模式以及实现方法总结

news2024/9/22 14:39:56

主图==========

目录

代码中使用的设计模式总结

  • 前言
  • 常见的23种设计模式
  • Singleton模式(单例模式)
    • 理论
    • Spring中创建的Bean
  • Prototype模式(原型模式)
    • 理论
    • Spring中创建的Bean
  • Builder模式(构造器模式)
    • 理论
    • @Builder实现了构造器模式
    • 参考
  • Proxy模式(代理模式)
    • 理论
    • Spring AOP 实现了代理模式
  • Factory模式(工厂模式)
    • Spring IOC 实现了工厂模式
  • Observer 模式(观察者模式)
    • 理论
    • Spring中使用
  • Adapter 模式(适配器模式)
    • 理论
    • Spring中使用
  • Wrapper 模式(装饰器模式)
    • 理论
    • Spring中使用
  • 参考


文章所属专区 日积月累


前言

我们知道,常见的有23种设计模式,我们在代码编写时可能有意无意会用到,或者使用一些框架,注解,插件时使用到,所以特此做一篇总结。

常见的23种设计模式

创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

Singleton模式(单例模式)

理论

单例模式是一个创建型模式,一个类只有一个实例,并提供一个访问它的全局访问点,可以直接访问,不需要实例化。

Spring中创建的Bean

Spring中创建的Bean默认都是单例的。

Prototype模式(原型模式)

理论

原型模式是一个创建型模式,用于创建重复对象,同时又能够保证其性能。

Spring中创建的Bean

Spring中创建的Bean制定其类型为prototype。

Builder模式(构造器模式)

理论

构造器模式是一个创建型模式,它的主要思想是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建出不同的表示。

@Builder实现了构造器模式

在Lombok插件中 @Builder 注解实现了构造器模式,假设在一个类上使用了@Builder注解,那么编译后,在这个类的class文件中会多出一个builer()方法和一个这个类的 public static xxx builder的静态内部类,持有要构建对象的所有属性,设置属性的方法都返回当前Builde实例this,这样可以流式的设置属性而不用一个个set了。
流式的设置属性例子(看着是不是方便了许多):

User user = User.builder()
                    .name("Tom")
                    .age(25)
                    .email("tom@example.com")
                    .build();

参考

Lombok的Builder与构造者模式

Proxy模式(代理模式)

理论

代理模式是一种结构型模式,它为其他对象提供一种代理以控制对这个对象的访问。

Spring AOP 实现了代理模式

Spring中的AOP允许开发者在不修改现有代码的情况下,向程序中新增新的功能(前置通知、后置通知、异常通知、返回通知还是环绕通知等)。Spring中的AOP基于代理模式,首先会自定义一个注解;其次,定义一个切面(Aspect)类,在切面中定义切点和通知,切点(方法的拦截规则),在使用了这个注解的方法会被拦截下来,拦截下来之后,就可以进行前置通知、后置通知、异常通知、返回通知还是环绕通知等。

Factory模式(工厂模式)

##理论
工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来指向新创建的对象。

Spring IOC 实现了工厂模式

在Spring中通过BeanFactory 个ApplicationContext创建Bean对象。Spring中 通过IOC容器来控制对象,而无需再由使用者控制。

Observer 模式(观察者模式)

理论

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。

Spring中使用

Listener,event,multicast。

Adapter 模式(适配器模式)

理论

适配器模式是一种结构型设计模式,它是作为两个不兼容的接口之间的桥梁,将一个类的接口转化成客户希望的另一接口。

Spring中使用

Adapter ,HandlerAdapter。

Wrapper 模式(装饰器模式)

理论

装饰器模式是一种结构型设计模式,许向一个现有的对象添加新的功能,同时又不改变其结构。

Spring中使用

BeanWrapper。

参考

JAVA 中常用的设计模式,含案例和注释
23种设计模式?一目了然!
设计模式:代理模式是什么,Spring AOP还和它有关系?

给个三连吧 谢谢谢谢谢谢了
在这里插入图片描述

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

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

相关文章

Tekton 基于 gitlab 触发流水线

Tekton 基于 gitlab 触发流水线 Tekton EventListener 在8080端口监听事件,Gitlab 提交代码产生push 事件,gitlab webhook触发tekton流水线执行。 前置要求: kubernetes集群中已部署 tekton pipeline、tekton triggers以及tekton dashboa…

分布式解决方案与实战

分布式多线程性能调优 使用多线程优化接口 //下单业务public Object order( long userId){long start System.currentTimeMillis();//方法的开始时间戳&#xff08;ms&#xff09;JSONObject orderInfo remoteService.createOrder(userId);Callable<JSONObject> calla…

如何看待「前端已死论」?

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Xcode编写基于C++的动态连接库(dylib)且用node-ffi-napi测试

创建一个dylib工程示例 在 Xcode 中创建一个动态链接库&#xff08;.dylib 文件&#xff09;的步骤如下&#xff1a; 打开 Xcode&#xff1a; 打开 Xcode 应用程序。 创建新的工程&#xff1a; 选择 "Create a new Xcode project"&#xff0c;或者使用菜单 File &g…

STM32 PVD掉电检测功能的使用方法

STM32 PVD掉电检测功能的使用方法 前言 在实际应用场景中&#xff0c;可能会出现设备电源电压异常下降或掉电的情况&#xff0c;因此&#xff0c;有时候需要检测设备是否掉电&#xff0c;或者在设备掉电的瞬间做一些紧急关机处理&#xff0c;比如保存重要的用户数据&#xff…

Java基础语法之多态

什么是多态 通俗来说就是多种形态&#xff0c;具体点就i是去完成某个行为&#xff0c;当不同的对象去完成时会产生不同的状态 都是吃东西&#xff0c;狗是吃狗粮&#xff0c;猫是吃猫粮 向上转型 本质就是创建一个子类对象&#xff0c;将其当作父类对象来使用 语法格式&am…

[Kubernetes]2. k8s集群中部署基于nodejs golang的项目以及Pod、Deployment详解

一. 创建k8s部署的镜像 1.部署nodejs项目 (1).上传nodejs项目到节点node1 (2).压缩nodejs项目 (3).构建nodejsDockerfile 1).创建nodejsDockerfile 具体可参考:[Docker]十.Docker Swarm讲解,在/root下创建nodejsDockerfile,具体代码如下: FROM node #把压缩文件COPY到镜像的…

pycharm多线程报错的问题(未解决)

暂未解决&#xff01;若有佬知道如何解决&#xff0c;还请不吝赐教~~~先谢过啦 问题描述&#xff1a; 看了一下可能是这里的问题&#xff1a; 根据建议&#xff0c;在walks之前加了 freeze_support() 但是没有效果。 关键是&#xff0c;在jupyter上运行是没有问题的&#x…

逆向获取某音乐软件的加密(js逆向)

本文仅用于技术交流&#xff0c;不得以危害或者是侵犯他人利益为目的使用文中介绍的代码模块&#xff0c;若有侵权请联系作者更改。 老套路&#xff0c;打开开发者工具&#xff0c;直接开始找到需要的数据位置&#xff0c;然后观察参数&#xff0c;请求头&#xff0c;cookie是…

1- Electron 创建项目、初始化项目

Electron官网 Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron Electron 初始化 初始化项目 - 构造package.json npm init -y 安装Electron模块包 npm i electron -D // 注意&#xff01;如果报错查看node包是否太高 配置启动脚本 {&quo…

安全护航:迅软DSE加密软件在设计院所图纸文件中的成功案例分享

近年来&#xff0c;随着信息化强国战略和可持续发展方针的推动&#xff0c;国内各大设计院所和建筑机构积极推进信息化建设&#xff0c;将电子文件作为主要的信息存储方式&#xff0c;并将其作为单位内外部信息交换的关键载体。在这一背景下&#xff0c;创新设计作为建筑设计单…

如何实现自己的训练集

在anaconda prompt中查看&#xff08;conda info -e&#xff09;、删除&#xff08;conda remove -n aimbot_env&#xff09;虚拟环境 其中aimbot_env是虚拟环境的名字 是否要删掉&#xff1f;选y 创建虚拟环境&#xff08;conda create -n aimbot_env python3.7.4&#xff0…

微信小程序---自定义组件

目录 1.局部引用组件 2.全局引用组件 3.组件和页面的区别 4.自定义组件样式 5.properties属性 6.data和properties的区别 7.数据监听器 8.纯数据字段 9.自定义组件-组件的生命周期 lifetimes节点 10.组件所在的页面的生命周期 pageLifetimes节点 11.插槽 &#x…

Redis设计与实现之简单的动态

目录 一、内部数据结构 二、简单动态字符串 1、sds的用途 实现字符串对象 将sds代替C默认的char*类型 2、Redis中的字符串 sds的实现 3、优化追加操作 4、sds 模块的 API 三、Redis动态字符串的内存分配和释放是如何进行的&#xff1f; 四、Redis动态字符串的扩容策略…

css+js 选项卡动画效果

选项卡上下左右翻转动画效果 <template><div class"web-box"><div class"topTitle"><div class"topTitle1">标题标题</div></div><div class"info-wrap"><div style"width: 100%;h…

互联网加竞赛 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于python 机器视觉 的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;3分 &#x1f9ff; 更多资…

掌握iText:轻松处理PDF文档-高级篇-添加页眉和页脚

推荐语 本文介绍了如何使用iText编程库为PDF文档添加自定义的页眉和页脚。通过指定位置、大小、字体和颜色等属性&#xff0c;你可以将文本、图像或其他元素添加到每一页的固定位置&#xff0c;实现专业、可读的自定义页眉和页脚效果。这对于需要批量处理大量PDF文档或需要更精…

基于轻量级GhostNet模型开发构建工业生产制造场景下滚珠丝杠传动表面缺陷图像识别系统

轻量级识别模型在我们前面的博文中已经有过很多实践了&#xff0c;感兴趣的话可以自行移步阅读&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…

YOLOv5改进 | 2023卷积篇 | AKConv轻量级架构下的高效检测(既轻量又提点)

一、本文介绍 本文给大家带来的改进内容是AKConv是一种创新的变核卷积&#xff0c;它旨在解决标准卷积操作中的固有缺陷&#xff08;采样形状是固定的&#xff09;&#xff0c;AKConv的核心思想在于它为卷积核提供了任意数量的参数和任意采样形状&#xff0c;能够使用任意数量…

***Cpolar配置外网访问和Dashy

Dashy是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一些网站聚合起来放在一起,形成自己的导航页。一款功能超强大,颜值爆表的可定制专属导航页工具 结合cpolar内网工具,我们实现无需部署到公网服务器…