设计模式的简单整理

news2024/10/5 15:26:30

单例的几种方式。

public class Single{
    private static volatile Single single;
    private single(){}
    public static Single getSingle(){
        if(single == null){
            synchronized(Single.class){
                if(single == null){
                    single = new Single();
                }
            }
        }
        return single;
    }
}

在dcl中volatile为了防止指令重排序而引入的。了解下single = new Single();这段代码其实不是原子性的操作,它至少分为以下3个步骤:

  1. 给single 对象分配内存空间
  2. 调用Single类的构造函数等,初始化single 对象
  3. 将single对象指向分配的内存空间,这步一旦执行了,那single对象就不等于null了

破坏单例模式的几种方法

  1. 实现序列化接口破坏单例模式,在反序列化时会使用反射机制创建一个新的对象。
    1. 解决方案是写一个readResolve方法返回实例,在反序列化代码中会判断hashReadResolveMethod,如果有会优先调用readResolve方法。
  2. 使用反射破坏单例模式
  3. 克隆破坏单例模式

单例模式

  1. 单例模式主要确保一个类只有一个实例

动态代理模式

  1. 为对象提供一种代理方式,控制对象的访问权限。
  2. jdk动态代理主要是实现invocationHandler接口,通过执行Proxy.newProxyInstance(classLoader,interface,this);创建一个代理对象,然后调用invoke方法执行代理对象的方法。

工厂模式

  1. 简单工厂模式(静态工厂)
    1. 虽然某种程度上符合设计原则,但实际使用较多。

  1. 工厂方法模式
    1. 不修改已有类的前提下,通过增加新的工厂类实现扩展。
  2. 抽象工厂模式
    1. List list1 = new ArrayList();
    2. List list2 = new LinkedList();
    3. 这个就是抽象工厂。List是一个接口,ArrayList和LinkedList根据自己的细节去完成自己的实现。

建造者模式

  1. 应用场景:需要生成的产品对象有复杂的内部结构,且这些产品对象具有共同的特性。
  2. 个人理解:现在有10个独立的方法,完成业务A可能需要其中的5个方法那么就调用这5个方法去完成业务A,如果业务B需要8个方法那么就去调用对应的8个方法。
  3. 举例子:比如一个汽车组装工厂,低配汽车可以组装如轮胎+车架+普通座椅完成组装,高配的汽车组装可以用轮胎+车架+天窗+真皮座椅+豪华音响组装完成。

链式编程

原型模式

  1. 原型模式就是clone()

适配器模式 adaper

  1. 使用场景, 当方法A要调用方法B时,A不能直接访问B,此时在A调用B时插入T方法,将A的参数转换成B所需要的入参。

桥接模式

  1. 如果一个系统需要在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使用它们在抽象层建立一个关联关系。
  2. 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

外观模式

  1. 一个功能的实现需要多个系统互相调用错综负责,外观模式是给这些个错综调用的系统提供一个接口,用户尽管去调用,不用考虑他是怎么实现的。

中介者模式

  1. 解决多系统互相调用的问题,使用中介者模式,各系统不在相互调用,而是独立出一个中间服务,各系统调用中间服务交互信息,经典的实现就是消息中间件。

策略模式 strategy

  1. 根据不同的条件选择执行不同的方法
  2. 比如我在计费系统中的使用,前端页面有40多种资源类型,后端处理的时候肯定不能写40个接口来返回参数
  3. 我根据策略模式来实现的,在controller里面我把40个类型的service存到了一个map的Value里面,key为账单对应的typeNo(唯一的),@PostConstruct进行初始化加载。
  4. 前端调用时只需要传typeNo,后端接收到用typeNo到map里面去拿对应的value就是service,调用getInfo方法,可以获取到对应类型的资源账单。

装饰器 Decorator

  1. 对一个现有的对象进行属性的设置,比如创建一个订单,我们可以定义一个方法填充他的属性,这就是最简单的装饰者模式的实现。

观察者模式

观察者模式的组成通常有三部分,观察者,被观察者,事件。多个观察者实现同一个观察者接口,实现监听方法,监听方法中包含Event事件参数,被观察者类的实现通常先创建一个列表泛型为观察者接口,这样就可以把不同的观察者添加到列表中,被观察者可以根据具体操作触发不同的事件,然后循环列表进行观察者的监听调用,观察者根据事件类型响应对应的业务操作,这样观察者模式就完成了。

组合模式

享元模式

共享源数据,把数据共享,不要每次用的时候都去申请,比如线程池,连接池,String str = "abc"; jvm常量池

责任链模式

  1. 适用场景:比如一个请假流程,3天以下研发组长审批,3-5天需要部门经理批,5天以上需要总监审批。
  2. 现在张三要请5天假,组长审批通过了,在调用下一级审批,部门经理审批通过了,再调用总监审批。
  3. 每一次只需要完成自己的工作无需关心上级或下级是如何完成的。调用方也无需关心链条是怎么执行的。
  4. 实现方法:首先要有一个抽象类,包含处理方法,和一下层对象的设置方法。
  5. 调用流程:level1.setNextLevel(level2);level2.process,在level1的执行执行法中调用nextLevel.process,以此类推完成整个责任链的调用。

命令模式

  1. 命令模式用于完成单一操作,命令模式包括 do 和 undo两部分,do为操作的执行,undo为操作的撤销。

备忘录模式

  1. 备忘录模式允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。
  2. 我们可以创建一个和要保存的对象属性完全相同的对象用来存储对象属性,同时将每次复制的对象存到stack栈中,这样在恢复的时候根据stack的后进先出规则完成数据的恢复。

模板模式

  1. 模板类规定应该执行哪些方法,比如需要顺序执行方法A、B、C、D最终完成一个程序,但是方法的具体实现细节需要实现类自己去完成。

状态模式

  1. 根据不同的状态执行相同的方法,方法的具体实现由状态来决定
  2. 状态模式可以代替if else
  3. 代码实现:
    1. 定义一个抽象的状态类status,一个doWork抽象方法由子类去实现具体的逻辑。
    2. 如果有状态加入,则继承status抽象类,重写doWoke方法,执行当前状态对应操作。

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

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

相关文章

你问我答|为什么说数据中心散热迎来拐点?

喜报!      “绿色领跑企业”      近期,戴尔荣获由中环联合认证中心(CEC)颁发的“绿色领跑企业”奖项,这是继“环保产品领跑者”之后的又一殊荣,恭喜戴尔!    作为全球领先的数字化解决方案供应商,戴尔将可持续发展置于一切工作的核心,以智能、高效的解决方案帮助…

scikit-learn 线性回归 LinearRegression 参数详解

scikit-learn 线性回归 LinearRegression 参数详解LinearRegression 参数详解参考文献LinearRegression 参数详解 # 从 sklearn 中引入线性模型模块 from sklearn import linear_model # 建立线性回归对象 reg reg linear_model.LinearRegression(fit_interceptTrue,copy_XTr…

Stack 155.最小栈

力扣155. 最小栈 【解法一】俩个栈实现 【解法二】一个栈实现 155. 最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推…

【C++】通过栈/队列/优先级队列/反向迭代器了解适配器及仿函数

目录 一、stack 实现一个stack 二、queue 实现一个queue 三、deque(双端对列)了解 1、deque的概念 2、为什么采用deque作为stack和queue的底层容器? 3、deque的缺点 3.1随机访问速度不如vector 3.2中间插入、删除速度不如list 3.3…

node.js——http模块

文章目录什么是 http 模块创建最基本的 Web 服务器request 请求对象response 响应对象解决中文乱码问题根据不同的 url 响应不同的 html 内容文件上传实战什么是 http 模块 http 模块是 Node.js 官方提供的、用来创建 Web 服务器的模块。 node.js提供了http模块,其…

【VCS Verdi】VCS Verdi 联合仿真总结

1. VCS 介绍VCS是编译型 Verilog 模拟器,它完全支持 OVI 标准的 Verilog HDL 语言、PLI 和 SDF。VCS 具有行业中较高的模拟性能,其出色的内存管理能力足以支持千万门级的 ASIC 设计,而其模拟精度也完全满足深亚微米 ASIC Sign-Off 的要求。VC…

C++模拟实现优先级队列(priority_queue)

目录 一、 仿函数 1.1仿函数的概念使用 1.2模拟实现仿函数 二、优先级队列(priority_queue) 2.1 优先级队列概念 2.2 优先级队列使用 2.3 模拟实现优先级队列 2.3.1 优先级队列类框架 2.3.2 模板参数 2.3.3 构造函数 2.3.4 仿函数 2.3.5 adjust_up (堆向…

linux系统中QT里面信号与槽的实现方法

大家好,今天主要来聊一聊,QT中信号与槽的使用方法。 目录 第一:QT中信号与槽简介 第二:如何在项目里创建信号 第三:如何在项目中创建槽 第四:项目中连接信号与槽 第一:QT中信号与槽简介 在学…

遥感图像处理:最小噪声分离变换(Minimum Noise Fraction Rotation,MNF Rotation)

遥感图像处理:最小噪声分离变换(Minimum Noise Fraction Rotation,MNF Rotation1.PCA变换2.MNF3.PCA和MNF1.PCA变换 在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中…

Django使用Celery异步发送短信(Django4.1.3+Celery5.2.7+ubuntu)

首先要下载Celery,直接pip就好 我的redis配置 CACHES {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://192.168.2.128:6379/0","OPTIONS": {"CLIENT_CLASS"…

自动化测试Seleniums~2

webdriver API 1.如何打开网页以及如何关闭一个浏览器。 package test_20230107;import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver;import static java.lang.Thread.sleep;public class Test {public static void main(String[] args)…

JavaEE多线程-线程的状态和安全问题

目录一、线程中的基本状态二、线程安全问题三、线程安全的标准类四、synchronized 关键字-监视器锁monitor locksynchronized 的特性五、volatile 关键字一、线程中的基本状态 NEW: 安排了工作, 还未开始行动, 就是创建了Thread对象, 但还没有执行start方法(内核里面还没有创建…

SpringSecurity(十一)【跨域】

十一、跨域 简介 跨域问题实际应用开发中的一个非常常见的需求,在 Spring 框架中对于跨域问题的处理方案有好几种,引入了 Spring Security 之后,跨域问题的处理方案又增加了 什么是 CORS CORS(Cross-Origin Resource-Sharing&…

联合证券|重磅数据出炉,道指飙涨700点!美股新年首周“开门红”!

美股涨嗨了! 当地时间1月6日,最新发布的美国12月非农工作陈述显现,美国工作市场终于呈现降温迹象,过去一年的激进加息成效初显。受此提振,美股三大股指高开高走,彻底改变前几日的跌势。从周k线看&#xff…

PCB结构和谐振(三)

PCB结构和谐振(一)PCB结构和谐振(二)仿真研究在本节中,我们首先对玻璃束的随机分布进行了简单的模拟研究。然后我们利用这些实验结论来简化常用的玻璃布3D结构。最后,这种简化的结构用于研究复杂层压板和两…

Java设计模式中原型模式是啥/浅克隆与深克隆又是什么/clone方法怎么回事

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 4.5 原型模式 4.5.1 概述 用已创建实例作为原型,通过复制该原型对象来创建一个和原型对象一样的新对象 4.5.2 结构 抽象原型类:规定具体…

Docker系列 深度使用nextcloud(九) 硬盘挂载

转自我的个人博客https://blognas.hwb0307.com,该文的内容更新仅在个人博客可见。欢迎关注! 前言 基于《Docker系列 搭建个人云盘服务nextcloud》,相信无论是在有/无443端口的Linux机子里均可成功安装Nextcloud。值得一提的是,Ne…

02、做点准备工作 osg\openscenegraph源代码下载 C++三维视频融合实战系列(时空克隆)

首先,要有一点C编程基础,熟悉VS2013开发环境。 在开始实践之前,先要搭建号VS2013开发环境。 然后,建议电脑安装windows 10 64位操作系统。 接下来需要在以下地址下载开源代码: 1、osg下载 打开openscenegraph主页…

CSS权威指南(七)视觉格式化

文章目录1.盒模型2.元素的显示方式3.行内元素1.盒模型 不管是什么元素,CSS都假定每个元素会生成一个或多个矩形框,我们称之为元素。各元素框的中心是内容区域,四周有可选的内边距、边框、轮廓和外边距。默认情况下,内容区的背景出现在内边距范围内。外边…

5分钟搞懂用户态,内核态

5分钟搞懂用户态,内核态 1. 什么是用户态,内核态 用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。 用户态,内核态…