2025高频面试设计模型总结篇

文章目录

  • 设计模型概念
  • 单例模式
  • 工厂模式
  • 策略模式
  • 责任链模式


设计模型概念

设计模式是前人总结的软件设计经验和解决问题的最佳方案,它们为我们提供了一套可复用、易维护、可扩展的设计思路。

(1)定义: 设计模式是一套经过验证的解决特定设计问题的模板,这些模板并不是代码,而是对类、对象以及它们之间如何协作的抽象描述。

(2)目的: 降低系统的耦合性、提高代码的复用性和可维护性,以及应对不断变化的需求。

(3)设计模式主要可以分为三大类:创建型、结构型和行为型。以下是一些在 JAVA 开发工程师面试中常见的设计模式:

1. 创建型模式

  • 单例模式(Singleton Pattern)
    • 定义: 确保一个类只有一个实例,并提供一个全局访问点。
    • 使用场景: 当系统中需要唯一一个对象来协调各部分工作,如配置管理、线程池、日志对象等。
  • 工厂模式(Factory Pattern)
    • 定义: 定义一个用于创建对象的接口,由子类决定实例化哪一个类。
    • 使用场景: 当系统中有大量对象创建需求,且对象之间具有共同接口或父类时,可以使用工厂模式封装对象的创建逻辑,降低耦合。
  • 建造者模式(Builder Pattern)
    • 定义: 将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。
    • 使用场景: 当一个对象的构造过程复杂,涉及多个步骤或多个可选参数时,使用建造者模式能让代码更清晰、更易扩展。

2. 结构型模式

  • 适配器模式(Adapter Pattern)
    • 定义: 将一个类的接口转换成客户期望的另一个接口,使得原本因接口不兼容而不能一起工作的类可以协同工作。
    • 使用场景: 当你想要使用一些现有的类,但它们的接口与当前系统不匹配时,可以使用适配器模式。
  • 装饰器模式(Decorator Pattern)
    • 定义: 动态地给一个对象添加一些额外的职责,而不影响其他对象。
    • 使用场景: 当系统需要在不改变原有对象结构的情况下增加功能时,装饰器模式提供了一种灵活的解决方案。
  • 外观模式(Facade Pattern)
    • 定义: 为复杂的子系统提供一个简单的接口,使得客户端可以更容易地使用子系统。
    • 使用场景: 当系统中存在多个相互依赖的类或接口时,通过外观模式可以将复杂性隐藏起来,提供一个统一的接口。

3. 行为型模式

  • 观察者模式(Observer Pattern)
    • 定义: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,其相关依赖对象会收到通知并自动更新。
    • 使用场景: 当一个对象状态的变化需要通知其他对象,且不知道这些对象的数量或具体类型时,可以使用观察者模式,如事件监听机制。
  • 策略模式(Strategy Pattern)
    • 定义: 定义一系列算法,把它们一个个封装起来,并使它们可以互换。
    • 使用场景: 当系统中存在多种算法或行为,并且需要根据具体情况选择不同的算法时,策略模式能使算法切换更为灵活。
  • 模板方法模式(Template Method Pattern)
    • 定义: 在一个方法中定义一个算法的骨架,将某些步骤延迟到子类中实现,从而使子类可以不改变算法结构的情况下重新定义算法的某些步骤。
    • 使用场景: 当多个子类有很多相同的行为,只在细节上略有不同的情况下,模板方法模式可以复用公共代码,同时让子类实现具体差异部分。
  • 代理模式(Proxy Pattern)
    • 定义: 为其他对象提供一种代理以控制对这个对象的访问。
    • 使用场景: 当你需要在访问对象时附加一些额外操作(如懒加载、安全控制、缓存等)时,可以使用代理模式来控制对象的访问。

单例模式

确保一个类只有一个实例,并提供一个全局访问点。
Spring 框架中,默认 bean 的作用域为单例(singleton),即在整个应用上下文中只存在一个实例。
如 Spring 的 ApplicationContext 在加载 bean 时会确保同一个 bean 只被实例化一次(除非配置为其他作用域)。

public class Singleton {// 饿汉式单例private static volatile Singleton instance = null;// 私有构造方法,防止外部实例化private Singleton() {}public static Singleton getInstance() {if (instance == null) {sychronized(Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

工厂模式

定义一个用于创建对象的接口,由子类决定实例化哪一个类。
Spring 的 BeanFactoryApplicationContext 实际上就是一个工厂,通过配置文件或注解来实例化并管理对象。

FactoryBean 接口允许开发者自定义 bean 的创建逻辑。

// 定义产品接口
public interface Product {void use();
}// 具体产品A
public class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("使用产品A");}
}// 具体产品B
public class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("使用产品B");}
}// 工厂类
public class ProductFactory {public static Product createProduct(String type) {if ("A".equals(type)) {return new ConcreteProductA();} else if ("B".equals(type)) {return new ConcreteProductB();}throw new IllegalArgumentException("未知产品类型:" + type);}
}// 测试入口
public class FactoryDemo {public static void main(String[] args) {Product productA = ProductFactory.createProduct("A");productA.use();Product productB = ProductFactory.createProduct("B");productB.use();}
}

策略模式

定义一系列算法,把它们一个个封装起来,并使它们可以互换。
当系统中有多种算法或行为需要在运行时动态切换时,可以使用策略模式。

Spring MVC 中,通过 HandlerAdapter 接口支持多种类型的控制器(如 @Controller@RestController 等),根据实际请求选择合适的适配器来处理业务逻辑。
事务管理、缓存策略等也采用了类似思想,通过接口和多种实现来动态选择行为。

// 策略接口
public interface Strategy {void execute();
}// 具体策略A
public class ConcreteStrategyA implements Strategy {@Overridepublic void execute() {System.out.println("执行策略A");}
}// 具体策略B
public class ConcreteStrategyB implements Strategy {@Overridepublic void execute() {System.out.println("执行策略B");}
}// 上下文,使用策略
public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public void executeStrategy() {strategy.execute();}
}// 测试入口
public class StrategyDemo {public static void main(String[] args) {Context contextA = new Context(new ConcreteStrategyA());contextA.executeStrategy();Context contextB = new Context(new ConcreteStrategyB());contextB.executeStrategy();}
}

责任链模式

将请求的处理对象连成一条链,每个处理者持有对下一个处理者的引用,按顺序处理请求或将其传递给下一个处理者。
当一个请求可能由多个对象处理,但不清楚到底由哪一个对象处理时,可采用责任链模式进行动态分派。

在 Spring Security 中,FilterChainProxy 维护了一系列过滤器(Filter),每个过滤器依次处理 HTTP 请求,决定是否放行、拒绝或进一步处理。

Spring MVC 中的拦截器链(HandlerInterceptor)也是一个责任链,每个拦截器按顺序处理请求的预处理和后处理工作。

// 责任链中的抽象处理者
public abstract class Handler {protected Handler next;// 设置下一个处理者public void setNext(Handler next) {this.next = next;}// 处理请求public abstract void handleRequest(String request);
}// 具体处理者A
public class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(String request) {if (request.contains("A")) {System.out.println("ConcreteHandlerA 处理请求: " + request);} else if (next != null) {next.handleRequest(request);}}
}// 具体处理者B
public class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(String request) {if (request.contains("B")) {System.out.println("ConcreteHandlerB 处理请求: " + request);} else if (next != null) {next.handleRequest(request);}}
}// 测试责任链模式
public class ChainDemo {public static void main(String[] args) {Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();// 设置责任链顺序handlerA.setNext(handlerB);// 测试请求:包含 "B" 的请求由 ConcreteHandlerB 处理handlerA.handleRequest("Request with B");// 测试请求:包含 "A" 的请求由 ConcreteHandlerA 处理handlerA.handleRequest("Request with A");}
}

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

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

相关文章

Java基础:面向对象进阶(二)

01-static static修饰成员方法 static注意事项(3种) static应用知识:代码块 static应用知识:单列模式 02-面向对象三大特征之二:继承 什么是继承? 使用继承有啥好处? 权限修饰符 单继承、Object类 方法重…

Spring框架如何做EhCache缓存?

在Spring框架中,缓存是一种常见的优化手段,用于减少对数据库或其他资源的访问次数,从而提高应用性能。Spring提供了强大的缓存抽象,支持多种缓存实现(如EhCache、Redis、Caffeine等),并可以通过…

NVIDIA显卡

NVIDIA显卡作为全球GPU技术的标杆,其产品线覆盖消费级、专业级、数据中心、移动计算等多个领域,技术迭代贯穿架构创新、AI加速、光线追踪等核心方向。以下从技术演进、产品矩阵、核心技术、生态布局四个维度展开深度解析: 一、技术演进&…

【BUG】生产环境死锁问题定位排查解决全过程

目录 生产环境死锁问题定位排查解决过程0. 表面现象1. 问题分析(1)数据库连接池资源耗尽(2)数据库锁竞争(3) 代码实现问题 2. 分析解决(0) 分析过程(1)优化数据库连接池配置(2)优化数…

【计算机网络应用层】

文章目录 计算机网络应用层详解一、前言二、应用层的功能三、常见的应用层协议1. HTTP/HTTPS(超文本传输协议)2. DNS(域名系统)3. FTP(文件传输协议)4. SMTP/POP3/IMAP(电子邮件协议&#xff09…

Linux 虚拟化方案

一、Linux 虚拟化技术分类 1. 全虚拟化 (Full Virtualization) 特点:Guest OS 无需修改,完全模拟硬件 代表技术: KVM (Kernel-based Virtual Machine):主流方案,集成到 Linux 内核 QEMU:硬件模拟器&…

树莓派 5 换清华源

首先备份原设置 cp /etc/apt/sources.list ~/sources.list.bak cp /etc/apt/sources.list.d/raspi.list ~/raspi.list.bak修改配置 /etc/apt/sources.list 文件替换内容如下(原内容删除) deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm …

WGAN原理及实现(pytorch版)

WGAN原理及实现 一、WGAN原理1.1 原始GAN的缺陷1.2 Wasserstein距离的引入1.3 Kantorovich-Rubinstein对偶1.4 WGAN的优化目标1.4 数学推导步骤1.5 权重裁剪 vs 梯度惩罚1.6 优势1.7 总结 二、WGAN实现2.1 导包2.2 数据加载和处理2.3 构建生成器2.4 构建判别器2.5 训练和保存模…

Unity网络开发基础 (3) Socket入门 TCP同步连接 与 简单封装练习

本文章不作任何商业用途 仅作学习与交流 教程来自Unity唐老狮 关于练习题部分是我观看教程之后自己实现 所以和老师写法可能不太一样 唐老师说掌握其基本思路即可,因为前端程序一般不需要去写后端逻辑 1.认识Socket的重要API Socket是什么 Socket(套接字&#xff0…

【linux】一文掌握 ssh和scp 指令的详细用法(ssh和scp 备忘速查)

文章目录 入门连接执行SCP配置位置SCP 选项配置示例ProxyJumpssh-copy-id SSH keygenssh-keygen产生钥匙类型known_hosts密钥格式 此快速参考备忘单提供了使用 SSH 的各种方法。 参考: OpenSSH 配置文件示例 (cyberciti.biz)ssh_config (linux.die.net) 入门 连…

真实笔试题

文章目录 线程题树的深度遍历 线程题 实现一个类支持100个线程同时向一个银行账户中存入一元钱.需通过同步机制消除竞态条件,当所有线程执行完成后,账户余额必须精确等于100元 package com.itheima.thread;public class ShowMeBug {private double balance; // 账户余额priva…

2.2 路径问题专题:LeetCode 63. 不同路径 II

动态规划解决LeetCode 63题:不同路径 II(含障碍物) 1. 题目链接 LeetCode 63. 不同路径 II 2. 题目描述 一个机器人位于 m x n 网格的左上角,每次只能向右或向下移动一步。网格中可能存在障碍物(标记为 1&#xff…

2874. 有序三元组中的最大值 II

给你一个下标从 0 开始的整数数组 。nums 请你从所有满足 的下标三元组 中&#xff0c;找出并返回下标三元组的最大值。 如果所有满足条件的三元组的值都是负数&#xff0c;则返回 。i < j < k(i, j, k)0 下标三元组 的值等于 。(i, j, k)(nums[i] - nums[j]) * nums[k…

【论文笔记】Llama 3 技术报告

Llama 3中的顶级模型是一个拥有4050亿参数的密集Transformer模型&#xff0c;并且它的上下文窗口长度可以达到128,000个tokens。这意味着它能够处理非常长的文本&#xff0c;记住和理解更多的信息。Llama 3.1的论文长达92页&#xff0c;详细描述了模型的开发阶段、优化策略、模…

JVM深入原理(一+二):JVM概述和JVM功能

目录 1. JVM概述 1.1. Java程序结构 1.2. JVM作用 1.3. JVM规范和实现 2. JVM功能 2.1. 功能-编译和运行 2.2. 功能-内存管理 2.3. 功能-即时编译 1. JVM概述 1.1. Java程序结构 1.2. JVM作用 JVM全称是Java Virtual Machine-Java虚拟机 JVM作用:本质上是一个运行在…

SQL Server Integration Services (SSIS) 服务无法启动

问题现象&#xff1a; 安装 SQL Server 2022 后&#xff0c;SQL Server Integration Services (SSIS) 服务无法启动&#xff0c;日志报错 “服务无法响应控制请求”&#xff08;错误代码 1067&#xff09;或 “依赖服务不存在或已标记为删除”。 快速诊断 检查服务状态与依赖项…

Spring Boot 定时任务的多种实现方式

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Java基础之反射的基本使用

简介 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。反射让Java成为了一门动…

AI产品的上层建筑:提示词工程、RAG与Agent

上节课我们拆解了 AI 产品的基础设施建设&#xff0c;这节课我们聊聊上层建筑。这部分是产品经理日常工作的重头戏&#xff0c;包含提示词、RAG 和 Agent 构建。 用 AI 客服产品举例&#xff0c;这三者的作用是这样的&#xff1a; 提示词能让客服很有礼貌。比如它会说&#x…

蓝桥杯刷题记录【并查集001】(2024)

主要内容&#xff1a;并查集 并查集 并查集的题目感觉大部分都是模板题&#xff0c;上板子&#xff01;&#xff01; class UnionFind:def __init__(self, n):self.pa list(range(n))self.size [1]*n self.cnt ndef find(self, x):if self.pa[x] ! x:self.pa[x] self.fi…