设计模式:春招面试的关键知识储备

在之前的文章中,我们深入探讨了分布式事务,了解了它在分布式系统中的重要性以及常见的解决方案。而在软件开发领域,设计模式是提升代码质量、可维护性和可扩展性的关键要素。设计模式是对软件开发中反复出现的问题的通用解决方案,它们提供了一种抽象和复用的思路,让开发者能够更高效地构建稳健的软件系统。在春招面试中,对设计模式的考察是检验候选人编程能力和设计思维的重要环节,下面我们就来详细了解。

一、设计模式的分类

设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。

  • 创建型模式:主要用于对象的创建过程,将对象的创建和使用分离,提高代码的灵活性和可维护性。常见的创建型模式有单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。例如,单例模式确保一个类只有一个实例,并提供全局访问点,在数据库连接池、线程池等场景中广泛应用,避免了资源的重复创建和浪费。
  • 结构型模式:关注如何将类或对象组合成更大的结构,以实现特定的功能。常见的结构型模式有代理模式、适配器模式、桥接模式、装饰器模式、外观模式、享元模式和组合模式。比如代理模式,为其他对象提供一种代理以控制对这个对象的访问,在远程方法调用、事务管理、权限控制等场景中发挥作用,通过代理对象可以在不修改目标对象的基础上,添加额外的功能。
  • 行为型模式:主要用于处理对象之间的交互和职责分配,关注对象之间的通信和协作方式。常见的行为型模式有策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式和解释器模式。以观察者模式为例,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新,在消息推送、事件驱动等场景中应用广泛。

二、常见设计模式原理与应用场景

单例模式

原理:单例模式通过将构造函数私有化,确保外部无法直接创建对象,同时提供一个静态方法来获取唯一的实例。在 Java 中,常见的实现方式有饿汉式和懒汉式。饿汉式在类加载时就创建实例,线程安全但可能造成资源浪费;懒汉式在第一次使用时创建实例,实现了延迟加载,但在多线程环境下需要额外的同步机制来保证线程安全。

应用场景:数据库连接池、日志记录器、线程池等需要全局唯一实例的场景。例如,在一个大型企业级应用中,数据库连接池使用单例模式,确保整个应用中只有一个连接池实例,避免了多个连接池实例带来的资源浪费和管理复杂性。

工厂模式

原理:工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂类负责创建对象的逻辑,将对象的创建和使用分离。例如,简单工厂模式中,工厂类有一个创建产品对象的方法,根据传入的参数决定创建哪种具体的产品对象;工厂方法模式中,工厂类是一个抽象类,定义了抽象的创建产品对象的方法,由具体的子类实现该方法来创建特定的产品对象。

应用场景:对象创建过程复杂,需要进行大量的初始化操作;根据不同条件创建不同类型的对象。在游戏开发中,创建不同类型的游戏角色(如战士、法师、刺客等)可以使用工厂模式,通过工厂类根据玩家的选择创建相应的角色对象,提高了代码的可维护性和扩展性。

代理模式

原理:代理模式中,代理对象和目标对象实现相同的接口,代理对象持有目标对象的引用。当客户端调用代理对象的方法时,代理对象可以在调用目标对象的方法前后添加额外的逻辑,如权限检查、日志记录、事务管理等。

应用场景:远程方法调用(RMI、RPC 等)、事务管理、权限控制、缓存等场景。在分布式系统中,当客户端需要调用远程服务时,通过代理对象可以隐藏远程调用的细节,如网络通信、序列化和反序列化等,使客户端像调用本地方法一样调用远程服务。

观察者模式

原理:观察者模式中,被观察对象(主题)维护一个观察者列表,当被观察对象的状态发生变化时,会通知所有注册的观察者,观察者根据接收到的通知进行相应的操作。在 Java 中,java.util.Observable类和java.util.Observer接口提供了观察者模式的基本实现。

应用场景:消息推送、事件驱动系统、图形界面中的事件处理等场景。在社交媒体平台中,当用户发布一条新动态时,关注该用户的其他用户(观察者)会收到通知,实现了信息的实时推送。

三、面试题

面试题 1:请简述单例模式的两种常见实现方式及其优缺点。

答案

  • 饿汉式:在类加载时就创建实例,优点是实现简单,线程安全;缺点是可能造成资源浪费,因为即使实例没有被使用,也会在类加载时创建。
  • 懒汉式:在第一次使用时创建实例,优点是实现了延迟加载,避免资源浪费;缺点是在多线程环境下需要额外的同步机制来保证线程安全,否则可能创建多个实例。

面试题 2:工厂模式和抽象工厂模式有什么区别?

答案

  • 工厂模式:定义了一个创建对象的接口,由子类决定要实例化的类是哪一个,通常创建单一类型的对象。例如简单工厂模式根据传入的参数创建不同的具体产品对象,工厂方法模式由具体子类实现创建特定产品对象的方法。
  • 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式可以创建多个不同类型的对象,这些对象之间可能存在一定的关联。例如,在一个游戏开发中,抽象工厂模式可以创建不同类型的游戏角色(战士、法师等)以及他们对应的武器(剑、法杖等),通过一个抽象工厂接口来统一管理这些对象的创建。

深入理解设计模式的原理和应用场景,能让你在春招面试中更好地展示自己的编程能力和设计思维。下一篇,我们将探索数据结构与算法相关知识,继续为你的春招面试备考助力。

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

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

相关文章

利用飞书机器人进行 - ArXiv自动化检索推荐

相关作者的Github仓库 ArXivToday-Lark 使用教程 Step1 新建机器人 根据飞书官方机器人使用手册,新建自定义机器人,并记录好webhook地址,后续将在配置文件中更新该地址。 可以先完成到后续步骤之前,后续的步骤与安全相关&…

混合专家模型MoE的全面详解

什么是混合专家(MoE)? 混合专家(MoE)是一种利用多个不同的子模型(或称为“专家”)来提升LLM质量的技术。 MoE的两个主要组成部分是: 专家:每个前馈神经网络&#xff08…

基于Arcsoft的人脸识别

目录 一、前言 二、使用方法 三、获取SDK 四、人脸检测/人脸识别 五、代码实现 一、前言 face++,百度ai,虹软,face_recognition,其中除了face_recognition是python免费的一个库安装好响应的库直接运行就好,另外三个需要填入相关申请的信息id和key。 分别对应着相应的人…

电梯系统的UML文档13

5.2.6 CarPositionControl 的状态图 图 24: CarPositionControl 的状态图 5.2.7 Dispatcher 的状态图 图 25: Dispatcher 的状态图 5.3 填补从需求到状态图鸿沟的实用方法 状态图能对类的行为,一个用例,或系统整体建模。在本文中,状态图…

Ollama windows安装

Ollama 是一个开源项目,专注于帮助用户本地化运行大型语言模型(LLMs)。它提供了一个简单易用的框架,让开发者和个人用户能够在自己的设备上部署和运行 LLMs,而无需依赖云服务或外部 API。这对于需要数据隐私、离线使用…

C++二叉树进阶

1.二叉搜索树 1.1二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一颗空树,或者具有以下性质的二叉树 若它的左子树不为空,则左子树上所有结点的值小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值…

亲测有效!解决PyCharm下PyEMD安装报错 ModuleNotFoundError: No module named ‘PyEMD‘

解决PyCharm下PyEMD安装报错 PyEMD安装报错解决方案 PyEMD安装报错 PyCharm下通过右键自动安装PyEMD后运行报错ModuleNotFoundError: No module named ‘PyEMD’ 解决方案 通过PyCharm IDE python package搜索EMD-signal,选择版本后点击“install”执行安装

2. Java-MarkDown文件解析-工具类

2. Java-MarkDown文件解析-工具类 1. 思路 读取markdown文件的内容&#xff0c;根据markdown的语法进行各个类型语法的解析。引入工具类 commonmark 和 commonmark-ext-gfm-tables进行markdown语法解析。 2. 工具类 pom.xml <!-- commonmark 解析markdown --> <d…

U盘打开提示格式化:深度解析与数据恢复全攻略

在数字化时代&#xff0c;U盘作为便捷的数据存储和传输工具&#xff0c;广泛应用于各个领域。然而&#xff0c;当我们满怀期待地插入U盘&#xff0c;却遭遇“U盘打开提示格式化”的尴尬局面时&#xff0c;那份焦虑与无助感油然而生。本文将全面剖析U盘打开提示格式化的原因、应…

HTB:Forest[WriteUP]

连接至HTB服务器并启动靶机 分配IP&#xff1a;10.10.16.21 靶机IP&#xff1a;10.10.10.161 靶机Domain&#xff1a;forest.htb 目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端…

芯片AI深度实战:实战篇之vim chat

利用vim-ollama这个vim插件&#xff0c;可以在vim内和本地大模型聊天。 系列文章&#xff1a; 芯片AI深度实战&#xff1a;基础篇之Ollama-CSDN博客 芯片AI深度实战&#xff1a;基础篇之langchain-CSDN博客 芯片AI深度实战&#xff1a;实战篇之vim chat-CSDN博客 芯片AI深度…

JavaScript - Web APIs(下)

日期对象 目标&#xff1a;掌握日期对象&#xff0c;可以让网页显示日期 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 学习路径&#xff1a; 实例化 日期对象方法 时间戳 实例化 目标&#xff1a;能够实例化日期对象 在代码中发…

【安全测试】测开方向学习遇到的问题记录

【问题一】springboot如何访问静态资源文件 springboot启动根路径位置 F:\untitled05\demo4\src\main\resources\static 例如图片位置存放在F:\untitled05\demo4\src\main\resources\static即可 配置文件配置 spring.web.resources.static-locationsfile:/F:/untitled05/de…

Unity|小游戏复刻|见缝插针2(C#)

控制针的运动 新建一个Pin脚本 将Pin脚本拖到针Pin的下面 保存代码 using UnityEngine;public class Pin : MonoBehaviour {public float speed 5;private bool isFly false;private bool isReach false;private Transform startPosition;// Start is called once bef…

2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

DeepSeek大模型技术解析:从架构到应用的全面探索

一、引言 在人工智能领域&#xff0c;大模型的发展日新月异&#xff0c;其中DeepSeek大模型凭借其卓越的性能和广泛的应用场景&#xff0c;迅速成为业界的焦点。本文旨在深入剖析DeepSeek大模型的技术细节&#xff0c;从架构到应用进行全面探索&#xff0c;以期为读者提供一个…

「AI学习笔记」深度学习的起源与发展:从神经网络到大数据(二)

深度学习&#xff08;DL&#xff09;是现代人工智能&#xff08;AI&#xff09;的核心之一&#xff0c;但它并不是一夜之间出现的技术。从最初的理论提出到如今的广泛应用&#xff0c;深度学习经历了几乎一个世纪的不断探索与发展。今天&#xff0c;我们一起回顾深度学习的历史…

渗透测试之WAF规则触发绕过规则之规则库绕过方式

目录 Waf触发规则的绕过 特殊字符替换空格 实例 特殊字符拼接绕过waf Mysql 内置得方法 注释包含关键字 实例 Waf触发规则的绕过 特殊字符替换空格 用一些特殊字符代替空格&#xff0c;比如在mysql中%0a是换行&#xff0c;可以代替空格 这个方法也可以部分绕过最新版本的…

深入理解若依RuoYi-Vue数据字典设计与实现

深入理解若依数据字典设计与实现 一、Vue2版本主要文件目录 组件目录src/components&#xff1a;数据字典组件、字典标签组件 工具目录src/utils&#xff1a;字典工具类 store目录src/store&#xff1a;字典数据 main.js&#xff1a;字典数据初始化 页面使用字典例子&#xf…

Linux网络之TCP

Socket编程--TCP TCP与UDP协议使用的套接字接口比较相似, 但TCP需要使用的接口更多, 细节也会更多. 接口 socket和bind不仅udp需要用到, tcp也需要. 此外还要用到三个函数: 服务端 1. int listen(int sockfd, int backlog); 头文件#include <sys/socket.h> 功能: …