分享几个项目中用到的设计模式

2023-11-19

前言

之前项目中出于扩展性和有雅性的考虑,使用了多种设计模式进行项目框架的设计。主要的一些设计模式是单例模式,工厂模式,策略模式,责任链模式,代理模式这几种。现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景。

核心设计模式分享

单例模式

使用场景:用于Minio客户端编写以及数据库连接池。
常见形式:
懒汉式,、饿汉式,双锁机制。

  • 懒汉式线程不安全:
    public class Singleton{
    private static Singleton singleton;
    private Singleton (){}
    public static Singleton getSingleton(){
    if(null==singleton){
    singleton = new Singleton();
    }
    return singleton;
    }
    }
  • 懒汉式线程安全:
    public class Singleton{
    private static Singleton singleton;
    private Singleton (){}
    public static synchronized Singleton getSingleton(){
    if(null==singleton){
    singleton = new Singleton();
    }
    return singleton;
    }
    }
  • 饿汉式线程安全:类加载机制避免了多线程同步问题,因为static对象类加载只会加载一次,所以其他线程获取到的对象都为同一个。
    public class Singleton{
    private static Singleton singleton = new Singleton();
    private Singleton (){}
    public static synchronized Singleton getSingleton(){
    return singleton;
    }
    }
  • 双锁机制:volatile防止指令重排序,线程可见性,synchronized所住类所有对象,线程安全,性能较好
    public class Singleton{
    private volatile static Singleton singleton;
    private Singleton (){}
    public static Singleton getSingleton(){
    if(null==singleton){
    synchronized(Singleton.class){
    if(null=singleton){
    singleton = new Singleton();
    }
    }
    }
    return singleton;
    }
    }
  • 内部类方式:类加载机制避免了多线程同步问题,因为static对象类加载只会加载一次,所以其他线程获取到的对象都为同一个。
    public class Singleton{
    private static class InnerSingleton{
    private static final Singleton singleton = new Singleton();
    }
    private Singleton (){}
    public static final synchronized Singleton getSingleton(){
    return InnerSingleton.singleton;
    }
    }

工厂模式

特点:所有对象共同实现一个接口,用户只需要输知道对象名称就可以获取到对象,不需要关心对象如何创建。
优点:每次需要增加对象类型时,只需要增加一个对象的具体实现即可。
缺点:对象数量过多时会导致系统复杂性较大
应用场景:JPA换数据时只需要更换数据库驱动和方言即可;流水线编排引擎中不同组件实现同一个接口,扩展组件只需要增加一个具体实现类。

代理模式

特点:对一个类进行访问控制时增加中间层,同时在代理方式中对具体类进行额外的处理。
优点:职责清晰,高扩展性。
缺点:代理可能会使请求变慢,实现代理需要额外的工作。
使用场景:远程代理,Spring-AOP。
注意事项:
1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

策略模式

解决问题:减少if/else的复杂性,区分一个系统中的很多类
特点:所以类实现同一个接口
优点:算法可以自由切换,避免使用多重判断,扩展性良好
缺点:策略类会增多,所有策略类都需要对外暴露
使用场景:一个系统里面有许多类,他们之间的区别在于他们的行为,那么使用策略模式可以动态让一个对象在许多行为中选择一种行为。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
策略模式和工厂模式区别:工厂模式目的是得到想要的对象,策略模式是避免使用过多if/else进行策略选择。

责任链模式

任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
解决问题:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
特点:处理消息的时候可以过滤很多道,拦截的类统一实现接口
关键代码:Handler 里面聚合它自己,在 HandlerRequest 里判断是否合适,如果没达到条件则向下传递,向谁传递之前 set 进去。
应用实例:JS事件冒泡,Struts2的拦截器,filter过滤器
优点:
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
缺点:
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。
使用场景:
1.有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时自动确定
2.可动态指定一组对象处理请求

结尾

设计模式的学习可以结合平时的技术框架进行理解学习,这样掌握的才能更加深入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分享几个项目中用到的设计模式 的相关文章

  • 计算资源合并模式——云计算架构常用设计模式

    背景 云计算的解决方案中 最初设计可能有意遵循关注点分离的设计原则 把操作分解为独立的计算单元以便可以单独托管和部署 然而 虽然这种策略可以帮助简化解决方案的逻辑实现 但是在同一个应用程序中要部署大量的计算单元 这会增加运行时的托管成本 并
  • Java 多线程模式 —— Guarded Suspension 模式

    Part1Guarded Suspension 模式的介绍 我们只从字面上看 Guarded Suspension 是受保护暂停的意思 1Guarded Suspension 模式 在实际的并发编程中 Guarded Suspension
  • 设计模式-建造者模式

    文章目录 建造者模式 创建复杂对象的优雅方式 什么是建造者模式 建造者模式的使用场景 优缺点 示例 使用建造者模式创建电脑对象 建造者模式 创建复杂对象的优雅方式 在软件开发中 有时候我们需要创建具有复杂结构和多个组件的对象 直接在客户端代
  • 设计模式-2--工厂模式(Factory Pattern)

    一 什么是工厂模式 工厂模式 Factory Pattern 是一种创建型设计模式 它提供了一种创建对象的接口 但是将对象的实例化过程推迟到子类中 工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象 而无需暴露对象的实例化逻辑 工厂
  • 分享几个项目中用到的设计模式

    前言 之前项目中出于扩展性和有雅性的考虑 使用了多种设计模式进行项目框架的设计 主要的一些设计模式是单例模式 工厂模式 策略模式 责任链模式 代理模式这几种 现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景 核心设计模式分享 单例
  • 第12课:生活中的构建模式——想要车还是庄园

    用程序来模拟生活 从剧情中思考构建模式 与工厂模式的区别 与组合模式的区别 构建模式的模型抽象 类图 基于升级版的实现 模型说明 应用场景 故事剧情 下周就要过年了 这是 Tony 工作后的第一个春节 还是在离家这么远的北京工作 所以肯定不
  • 设计模式--提供者模式provider

    设计模式 C 提供者模式 Provider Pattern 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml文件里 根据配置文
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • Spring框架之AOP详解

    Spring AOP 理论 AOP 灵魂三问 AOP的一些术语概念 Spring AOP 底层实现 五种通知形式 实现 如何写切面类 具体举例 理论 AOP 灵魂三问 1 AOP是什么 AOP中文叫做面向切面编程 为Aspect Orien
  • [C++]外观模式

    外观模式 Facade Pattern 隐藏系统的复杂性 并向客户端提供了一个客户端可以访问系统的接口 这种类型的设计模式属于结构型模式 它向现有的系统添加一个接口 来隐藏系统的复杂性 这种模式涉及到一个单一的类 该类提供了客户端请求的简化
  • 设计模式(2)

    2 2 结构型模式 结构型模式一共有七种 其中 适配器模式和装饰模式统称为包装模式 装饰模式和代理模式的类图基本相同 但目的不同 这些有相似目的或者有相似结构的模式需要对其概念辨析清楚 才能较好地掌握 下面将对结构型模式分别进行介绍 2 2
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • Java设计模式:模板方法模式

    作者主页 欢迎来到我的技术博客 个人介绍 大家好 本人热衷于 Java后端开发 欢迎来交流学习哦 如果文章对您有帮助 记得 关注 点赞 收藏 评论 您的支持将是我创作的动力 让我们一起加油进步吧 文章目录 一 模板方法模式的定义 二 模板方
  • Java 中单例模式的常见实现方式

    一 什么是单例模式 单例模式是一种创建型设计模式 它确保类只有一个实例 并提供全局访问点让外部代码可以访问该实例 在 Java 中 可以 使用单例模式来实现 一些全局性的操作 例如 配置文件管理 线程池管理 数据库连接池管理 等等 这些操作
  • 自动化测试面试题(附答案)

    1 自动化代码中 用到了哪些设计模式 单例设计模式 工厂模式 PO设计模式 数据驱动模式 面向接口编程设计模式 2 什么是断言 Assert 断言Assert用于在代码中验证实际结果是不是符合预期结果 如果测试用例执行失败会抛出异常并提供断
  • 【设计模式之美】面向对象分析方法论与实现(二):需求到接口实现的方法论

    文章目录 一 进行面向对象设计 1 划分职责 gt 需要有哪些类 2 定义类及其属性和方法 3 定义类与类之间的交互关系 4 将类组装起来并提供执行入口 二 如何进行面向对象编程 1 接口实现
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并
  • 用CHAT如何写大学生会计综合模拟实训报告

    CHAT回复 标题 大学生会计综合模拟实训报告 一 前言 随着信息化时代的发展 现代会计工作不再只依赖手动运算和记录 而是更加倚重电脑软件系统的配合运用 因此 对我们大学生来说 把握会计理论知识的同时 积极掌握相关的实践应用技能变得非常重要
  • 利用CHAT写实验结论

    问CHAT 通过观察放置在玻璃表面上的单个水滴 人们可以观察到水滴充当成像系统 探究这样一个透镜的放大倍数和分辨率 CHAT回复 实验报告标题 利用玻璃表面的单一水滴观察成像系统的放大倍数和分辨率 一 实验目的 通过对比和测量 研究和探索玻
  • 用CHAT分析高校体育智慧教学体系构建与探索研究现状

    CHAT回复 现阶段 高校体育智慧教学体系的构建与探索研究还处于初级阶段 但全球数字化转型大潮的推动下 一些较为前沿的研究和实践已经开始出现 1 教学平台的建设 很多高校已经开始尝试使用在线教育平台进行体育教学 把传统的面对面授课模式转变为

随机推荐

  • SqliLabs Less26-26a

    第二十六关 GET类型基于你所有的空格和言论都是属于我的错误 1 判断注入点 根据提示 sql语句应该存在过滤 观察源代码发现存在or and 空格 斜杠过滤 绕过方法 Or and 采取双写绕过 注释过滤 采取and 1闭合语句绕过 空格
  • 获取url内的参数数据

    例如我们的页面 是含有参数的 类似于 www baidu com userdata 百度用户 我们想获得 url内的userdata的数据值 那么就需要 使用下方这个正则判断方式来进行计算 window location href 这个可以
  • SSM 基础面试题

    什么是 MyBatis 参考答案 1 MyBatis 是一个半自动 ORM 对象关系映射 框架 它内部封装了 JDBC 开发时只需要关注 SQL 语句本身 不需要花费精力去处理加载驱动 创建连接 创建 statement 等繁杂的过程 程序
  • VMware 中的 Ubuntu 虚拟机看不到共享文件夹怎么办?

    初学Linux 在VMWare 上装了Ubuntu14 04 主机端和虚拟机相互间的访问是必不可少的 途径有许多 其中vmware tool提供的共享文件夹方式简单又方便 然而 有时却莫名其妙的 在Ubuntu上看不到共享文件夹了 网上查了
  • 【vue3+elementplus】动态设置二次封装的el-form组件中的v-model绑定的变量名

    众所周知 在form表单中 el select el input等需要使用v model绑定变量 这个变量就是当前选择 输入的内容 一般会取ruleForm作为入参
  • java对象赋值给另一个对象_java注解实现对象的属性赋值,从此少写代码,快乐生活...

    各位志同道合的朋友们大家好 我是一个一直在一线互联网踩坑十余年的编码爱好者 现在将我们的各种经验以及架构实战分享出来 如果大家喜欢 就关注我 一起将技术学深学透 我会每一篇分享结束都会预告下一专题 我们平时在做一些业务时 从前台获取的数据用
  • 自定义模块导入错误

    当在python2 7 导入自定义模块 发生Importerror No module named xxx时 可将模块所在路径拷贝到E xxx python2 7 Lib site packages下 再进行导入则可解决问题 经过多方的摸索
  • MobaXterm出现X11-forwarding : ✘ (disabled or not supported by server)及conda: command not found等问题

    x11 forwarding disabled解决办法 3L csdn的博客 CSDN博客 如何安装X11 xorg https www cnblogs com yun qi p 16201843 html如何解决在Ubuntu中使用x11
  • 机器学习之线性回归——OLS,岭回归,Lasso回归

    机器学习之线性回归 线性回归 最小二乘法 OLS 岭回归 Ridge Regression Lasso回归 OLS 岭回归 Lasso回归之间对比 线性回归 什么是线性回归呢 其实线性回归是统计学中的 线性回归 Linear Regress
  • java 中的指针_Java中的指针

    java 中的指针 Java中有指针吗 简短的答案是 不 没有 这对于许多开发人员来说似乎是显而易见的 但是 为什么对其他人却不那么明显呢 http stackoverflow com questions 1750106 how can i
  • STM32实现HID键盘

    上面是我的微信和QQ群 欢迎新朋友的加入 这个帖子不是技术贴 是成品分享贴 电路设计 实物图 软件设计 功能说明 1 固件通过虚拟U盘升级 2 自定义按键功能 全键盘 3 七彩灯颜色设置 4 多媒体按键功能 5 支持按键双击和单击操作 6
  • c语言药房管理系统

    include
  • VisualStudio代码片段管理

    文章目录 前言 1 查看代码片段 2 插入代码片段方式 3 使用扩展创建代码片段 3 1 安装VS2019的扩展 3 2 使用扩展创建代码片段 4 不知为何 VS2022我安装一直有问题 扩展安装成功 但是新建文件没有 Snippet De
  • Unity 运行FixedUpdate()无响应

    问题 最近在学习unity时 根据 史上最全Unity3D教程 哔哩哔哩 bilibili 在Visual Studio中编写如下代码时 Unity的Console面板并没有输出预期的信息 即按每个固定帧速率的帧调用FixedUpdate
  • Matlab导出动态链接库dll

    1 新建 m文件 内容 function c Add a b c a b end 保存为 Add m 2 命令行输入 gt gt mex setup MEX configured to use Microsoft Visual C 2013
  • 各种注释总结

    jsp注释 html注释
  • C语言—指针

    文章目录 1 指针 1 1 指针的定义 1 2 和 1 3 指针与堆内存 1 4 指针运算 1 5 常量指针与指针常量 1 5 1 常量指针 1 5 2 指针常量 1 6 函数指针 2 指针与数组 3 指针与函数 4 指针与链表 4 1 链
  • cmake中的编译选项

    CMake是一个跨平台的构建系统 它可以根据简单的配置文件生成各种平台的构建工具 例如Makefile Visual Studio项目文件等 CMake使用CMakeLists txt文件来描述项目的构建规则和依赖关系 在这个文件中 可以设
  • 浅谈opencv3.2中各个模块的简介

    3 2版本的模块说明 Opencv3 2模块 首先打开opencv modules hpp文件 可以看到对于各个功能模块的定义如下 This file defines the list of modules available in cur
  • 分享几个项目中用到的设计模式

    前言 之前项目中出于扩展性和有雅性的考虑 使用了多种设计模式进行项目框架的设计 主要的一些设计模式是单例模式 工厂模式 策略模式 责任链模式 代理模式这几种 现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景 核心设计模式分享 单例