当前位置: 首页 > news >正文

常用设计模式介绍

java设计模式类型

  • 创建型模式:将对象的创建与使用分离

  • 结构型模式:如何将类和对象按照某种布局组成更大的格局

  • 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务

23种设计模式介绍

1.单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局

访问点供外部获取该实例,其拓展是有限多例模式。

2.原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆

出多个和原型类似的新实例。

3.工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子

类决定生产什么产品。

4.抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个

子类可以生产一系列相关的产品。

5.建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然

后根据不同需要分别创建它们,最后构建成该复杂对象。

6.代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客

户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。

7.适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,

使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

8.桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组

合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

9.装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功

能。

10. 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子

系统更加容易被访问。

11. 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复

用。

12. 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象

和组合对象具有一致的访问性。

13. 模板方法(TemplateMethod)模式:定义一个操作中的算法骨架,而将算

法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定

义该算法的某些特定步骤。

14. 策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它

们可以相互替换,且算法的改变不会影响使用算法的客户。

15. 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任

和执行请求的责任分割开。

16. 职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下

一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。

17. 状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能

力。

18. 观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改

变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。

19. 中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互

关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。

20. 迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数

据,而不暴露聚合对象的内部表示。

21. 访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个

元素提供多种访问方式,即每个元素有多个访问者对象访问。

22. 备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对

象的内部状态,以便以后恢复它。

23. 解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的

解释方法,即解释器

常用设计模式:

单例模式

定义:在有些系统中,为了节省内存资源、保证数据内容的一致性,创建一个实例共大家享用,例如:Runtime类

特点

  • 单例只有一个实例对象

  • 该单例对象必须由单例类自行创建

  • 单例;类对外提供一个公共的方法进行访问

  1. 饿汉模式

在这里拿window为例给大家进行演示

public class Window {/*饿汉式单例:在类加载的时候的初始化实例(static)* 因为创建的实例只有一个,所以不存在线程安全问题*/private static Window window=new Window();public Window getWindow(){return window;}
}
public class Test {public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{System.out.println(new Window().getWindow());//获得是同一个对象}).start();}}
}
  1. 懒汉模式

public class Window {/*懒汉式单例:* 在类加载的时候,不创建对象,在使用时进行创建* 这时,生成对象的数量就需要我们自己来进行控制* 但是懒汉式单例会出现线程安全问题:在多线程访问时,可能会有多个线程同时进行到if中,就会创建出多个对象* 在并发的时候,会出现指令重排的情况,所以用volatile防止指令重排,避免造成错误*/private static volatile Window window;public Window getWindow(){try {//增加休眠增加并发的几率Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//1.0版本给方法上锁,虽然可行,但是效率太低,每次只能运行一个线程// if(windows==null){  1.1版本 进入if之后上锁,这种上锁起不到多个线程公用一个对象实例的作用,一个执行完之后,另外一个线程进入重新创建一个实例对象// synchronized (Windows.class){// window=new Window()}
//}//最终版本,双重判断,公用一个对象实例if(window==null){synchronized (Window.class){if (window==null){window=new Window();}}}return window;}
}
public class Test {public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{System.out.println(new Window().getWindow());}).start();}}
}

工厂模式

  1. 简单工厂:适用于产品子类较少,不符合开闭原则

模式中包含的角色及其职责

工厂:负责逻辑运算以及创建所需要的产品

抽象产品:描述所有实例共有的接口或者是抽象类

具体产品抽象:是简单工厂的创建目标

代码实现:

//Car接口
public interface Car {void run();
}
//CarFactory工厂类
public class CarFactory{public static Car createCar(String name){if(name.equals("aodi")){return new Aodi();}if(name.equals("bmw")){return new Bmw();}return null;}
}
//实现类
public class Aodi implements Car{@Overridepublic void run() {System.out.println("奥迪汽车行驶");}
}
//实现类
public class Bmw implements Car{@Overridepublic void run() {System.out.println("宝马汽车行驶");}}
//客户端
public class Test {public static void main(String[] args) {//每次增加子类类型的时候,需要对代码进行修改,不符合开闭原则,适用于子类较少或者是不容易修改的项目中//优点:客户端不负责对象的创建,由专门的工厂进行创建,客户端直需要对对象进行调用,实现创建和调用的分离,降低了代码的耦合度//缺点:如果增加或减少子类,需要对代码进行修改,违背了设计原则中的开闭原则,如果子类过多,会导致工厂非常庞大,违背了高内聚原则,不利于后期的维护Car bmw  = CarFactory.createCar("bmw");Car aodi  = CarFactory.createCar("aodi");bmw.run();aodi.run();}
}
  1. 工厂方式模式

对工厂也进行了抽象,将实际创建工作推迟到子类去完成

优点:客户端不负责创建对象的创建,而是由专门的工厂类完成,客户端只负责对象的调用,实现了创建和调用的分离,降低了客户端代码的难度,若增加和减少产品子类,不需要对工厂进行修改,直需要增加产品子类和工厂子类,符合开闭原则,即使产品子类过多也不会导致工厂类的庞大,利于后期的维护

缺点:需要些额外的代码,增加了工作量

抽象工厂模式

将同一品牌的物品放在一起进行生产,就好比你去生产联的大厂中既可以买到联想手机也可以买到联想电脑,不用将它们分别生产,造成资源浪费

优点:获取具体系列产品只需要通过具体的系列的工厂获取,无心关心创建的细节

原型模式:

在项目中,我们需要很多个实例,但是创建实例对象又很麻烦,所以觉得直接创建对象是一个不太明智的选择,所以我们经常在需要多次创建相同的对象的时候用到克隆(clone),为了提高创建速度

代理模式:

代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用,使得客户不能直接与真正的目标对象通信,代理对象是对象的代表,客户端通过代理对象对实际对象进行操作

  • 静态代理

特点:代理类实现一个接口,任何实现给接口的对象,都可以通过代理类进行代理,增加了通用性

优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展

缺点:代码量大,必须要有接口,再有代理

//Computer对象类
public class Compurter implements Huawei{@Overridepublic void run() {System.out.println("华为电脑跑步机器");}@Overridepublic void play() {System.out.println("华为电脑在玩");}
}
//customer客户端
public class customer {public static void main(String[] args) {Phone phone=new Phone();Compurter compurter=new Compurter();Proxy proxy1=new Proxy(phone);Proxy proxy=new Proxy(compurter);proxy.play();proxy1.run();}}
//Huawei接口
public interface Huawei {public void run();public void play();
}
//Phone对象类
public class Phone implements Huawei{@Overridepublic void run() {System.out.println("华为手机在跑步");}@Overridepublic void play() {System.out.println("华为手机在玩");}}
//Proxy代理对象
public class Proxy implements Huawei {Huawei huawei;public Proxy(Huawei huawei){this.huawei=huawei;}@Overridepublic void run() {try {System.out.println("你是大坏蛋");} catch (Exception e) {} finally {System.out.println("终于完了");}}@Overridepublic void play() {huawei.play();}
}
  • 动态代理

通过动态代理我们就不需要手动的创建代理类了,只需要编写一个动态处理就可以了,代理对象通过动态处理

jdk动态代理:

public class JdkProxy implements InvocationHandler {Object object;//真实对象,接收任何的目标类对象public JdkProxy(Object object){this.object=object;}/* 在动态代理类中调用目标类中的具体方法,动态的将代理对象对象* 目标类中要调用方法,以及方法中的参数传递过来*  Method method  动态获取的真正要执行的方法*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {method.invoke(object);return proxy;}//真正意义上的运行时生成代理对象public Object getProxy(){return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);}
}

cg动态代理:

/** 动态代理类*/
public class CGLibProxy implements MethodInterceptor {private Enhancer enhancer = new Enhancer();public Object getProxy(Class<?> clazz){  enhancer.setSuperclass(clazz);  enhancer.setCallback(this);  return enhancer.create();  }  /** 拦截所有目标类方法的调用 * 参数: * obj  目标实例对象 * method 目标方法的反射对象 * args 方法的参数 * proxy 代理类的实例 */  public Object intercept(Object obj, Method method, Object[] args,  MethodProxy proxy) throws Throwable {//代理类调用父类的方法  System.out.println("开始事务");  Object obj1 = proxy.invokeSuper(obj, args);  System.out.println("关闭事务");  return obj1;  }
}

相关文章:

常用设计模式介绍

java设计模式类型创建型模式&#xff1a;将对象的创建与使用分离结构型模式&#xff1a;如何将类和对象按照某种布局组成更大的格局行为型模式&#xff1a;用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务23种设计模式介绍1.单例&#xff08;Singleton&…...

关于货物物品横竖摆放的问题

货车内宽是2.4米。考虑到最多装载&#xff0c;长宽130100的货品&#xff0c;应该横竖摆放。 横竖摆放的数量如何自动计算呢&#xff1f; 采用数学公式&#xff0c;计算如下&#xff1a; 横向摆放数(int)(横长竖高)*数量/4/横长 竖向摆放数数量-横向摆放数 结果如下&#x…...

人员定位需求多,场景目标各不同

GPS技术为现代人带来了许多便利&#xff0c;也提供了诸多基于位置的新型服务。随着科技的发展&#xff0c;人员位置信息在如今的生产生活中也越发重要起来。因此&#xff0c;不同行业领域开始关注人员定位&#xff0c;尤其关注室内人员定位。室内人员定位需求从目的性出发&…...

怎么解决首屏加载速度过慢的问题

怎么解决首屏加载速度过慢的问题首屏加载速度指的是什么&#xff1f;解决方法首屏加载速度指的是什么&#xff1f; 首屏加载速度指的是浏览器从响应用户输入网站地址到首屏内容渲染完成的时间。值得注意的是此时整个网页不一定要全部渲染完成&#xff0c;只需展示当前视窗所需要…...

3d视觉相关论文阅读目录汇总

目录3d视觉综述论文 Deep Learning for 3D Point Clouds: A Survey 基础概念 3d目标检测常见基础概念 3d目标检测 & 自动驾驶 数据集 3d目标检测数据集介绍&#xff08;数据格式&#xff0c;保存形式&#xff0c;适配算法库等&#xff09; KITTI数据集 Waymo数据集 nu…...

最简单的计算机视觉

百度为大家提供了计算机视觉模型。能够识别图像中的相关物体。 给大家介绍计算机视觉工具&#xff0c;EasyDL是能够识别物体&#xff0c;图像分类的工具&#xff0c;可以在线&#xff0c;也可以本地下载&#xff0c;本地下载大概1.5G。 图像识别真实距离。 图片真实距离/物体…...

泛微采知连,为组织提供安全、合规、智能的数字化文控系统

作为市场主体&#xff0c;企业需要建立健全的质量管理体系&#xff0c;并且及时更新&#xff0c;以应对激烈的市场竞争&#xff0c;实现企业可持续发展。 质量体系在很大程度上通过文件化的形式表现出来。《质量管理体系要求》(GB/T19001—2016/ISO9001&#xff1a;2015)标准指…...

Python if else对缩进的要求

前面的《Python if else》一节展示了选择结构的三种基本形式&#xff0c;并给出了实例演示&#xff0c;但是大家在编写代码过程中仍然要注意一些细节&#xff0c;尤其是代码块的缩进&#xff0c;这对 if else 选择结构极其重要。 Python 是以缩进来标记代码块的&#xff0c;代…...

java常用设计模式

java设计模式java设计模式类型常用设计模式单例模式单例模式的两种创建方式饿汉式单例懒汉式单例工厂模式简单工厂模式工厂方法模式抽象工厂模式原型模式代理模式代理模式结构静态代理动态代理jdk代理Cglib代理java设计模式类型 根据完成的工作类型设计模式分为创建型模式、结…...

死锁(5.1)

死锁 1 死锁的基本概念 1.1 死锁的定义 死锁是发生在一组相互合作或竞争的线程或进程中的一个问题。因此可以定义为&#xff1a;一组竞争系统资源或相互通信的进程相互的“永久”阻塞。若无外力作用&#xff0c;这组进程将永远不能继续执行。 1.2死锁产生的原因进程 &…...

Python 之 Matplotlib 第一个绘图程序和基本方法

文章目录一、第一个 Matplotlib 绘图程序1. Matplotlib 绘图的基本步骤二、Matplotlib 的基本方法1. 图表名称 plt.title()2. x 轴和 y 轴名称3. 设置 x 轴和 y 轴的刻度4. 显示图表 show()5. 图例 legend()6. 图例的图例位置设置7. 显示每条数据的值 x,y 值的位置一、第一个 M…...

数据结构与算法(一):概述

数据结构学了有一年左右的时间了&#xff0c;但是一直没有详细地总结一下&#xff0c;现在回想起来&#xff0c;感觉有些内容忘记了。所以接下来一段时间我将重新归纳总结一下&#xff0c;算是温故而知新了。 一、数据结构 1、定义 数据结构是计算机存储、组织数据的方式。在…...

Spring3之Bean的属性详解

简介 Spring 中大量使用到 Bean 的注入来实现各个模块之间的依赖&#xff0c;本章将详细介绍 Bean 的主要属性 id 和 name 属性 每个 Bean 可以有一个 id 属性&#xff0c;并可以根据该 id 在 IoC 容器中查找该 Bean&#xff0c;该 id 属性值必须在IoC 容器中唯一 可以不指定…...

C语言之结构体内存的计算

结构体的内存 一.提出疑问 结构体占用的是一片连续的内存空间&#xff0c;大小是由成员变量的类型决定的。但并不是计算所有成员变量的类型大小之和那么简单。 先举一个实例&#xff1a; struct student {int age; //4个字节int telephone; //4个字节 }; int main() {struc…...

Java网络编程之UDP和TCP套接字

文章目录一. 网络编程概述二. UDP网络编程1. UDP套接字2. UDP客户端回显服务器程序2.1 UDP回显服务器2.2 UDP客户端2.3 UDP实现查词典的服务器三. TCP网络编程1. TCP套接字2. TCP客户端回显服务器程序2.1 TCP回显服务器2.2 TCP客户端2.3 解决服务器无法同时出力多个客户端的问题…...

Linux进程信号产生以及捕捉

一.什么是信号 生活中&#xff0c;有哪些信号相关的场景呢&#xff0c;比如&#xff1a;红绿灯&#xff0c;闹钟&#xff0c;转向灯等等 1.这里我们要知道&#xff0c;你为什么认识这些信号呢&#xff0c;记住了对应场景下的信号&#xff0b;后续是有”动作“要你执行的 2.我们…...

11. GLSL(OpenGL Shader Language)常用知识点汇总

1. 说明&#xff1a; 在使用OPenGL进行三维模型渲染时&#xff0c;需要使用到两个着色器对模型进行位置设置和颜色设置&#xff0c;分别为顶点着色器和片段着色器&#xff0c;这两个着色器是使用 GLSL 语法进行编写的。这篇文章总结了一些GLSL中的一些基本语法知识。 2. 基本…...

转发一张网络工程师考试的试卷2021.5.15

网络工程师考试 单选题 &#xff08;30题&#xff0c;每题1分&#xff0c;共30分&#xff09; 1. 你在一个网络中实现DHCP服务&#xff0c;配置一些计算机成为DHCP客户端&#xff0c;由于工作需要&#xff0c;一台系统为Windows 10 的客户端要把从DHCP服务器获得的地址释放&a…...

AMD发布23.2.1 新驱动 支持开年新作《魔咒之地》

如果说2023年有什么新作&#xff0c;《魔咒之地&#xff08;Forspoken&#xff09;》当属开年大作之一&#xff0c;1月25日才在steam平台发售。虽然开售后的表现似乎不如想象中优秀&#xff0c;加之价格相对昂贵&#xff0c;令不少玩家望而却步&#xff0c;但如果只是想尝鲜&am…...

开放平台如何做接口的签名和加解密?

目录安全性功能介绍实现流程开放平台依赖代码AES加解密工具类PlatformConfigRequestUtilsPlatformServiceCommonCodeZuulFilterHelperServerResponsePlatformContactRsaSignatureRsaUtilsStreamUtil开放平台-解密过滤器开放平台-加密过滤器调用方代码公共代码Get-DemoPost-Demo…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...