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

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

一、设计模式的分类

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

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

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

单例模式

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

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

工厂模式

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

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

代理模式

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

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

观察者模式

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

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

三、面试题

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

答案

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

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

答案

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

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

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

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

相关文章

上位机知识篇---Linux的shell脚本搜索、查找、管道

文章目录 前言第一部分:什么是shell?1. 基本结构脚本声明注释命令和表达式例子 2.变量控制结构条件判断 3.函数输入输出重定向 4.执行命令5.实际应用 第二部分:Linux的搜索、查找、管道命令1.搜索命令2.查找命令3.管道操作 总结 前言 以上就…

利用飞书机器人进行 - 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 填补从需求到状态图鸿沟的实用方法 状态图能对类的行为,一个用例,或系统整体建模。在本文中,状态图…

自动化运维在云环境中的完整实践指南

随着云计算的普及,越来越多的企业将业务迁移到云上。云环境的高动态性和复杂性使得传统的手动运维方式难以应对,自动化运维成为提升效率、降低成本、保障系统稳定性的关键。本文将详细介绍如何在云环境中实施自动化运维,涵盖工具选择、实施步骤和最佳实践。 © ivwdcwso…

性能测试丨分布式性能监控系统 SkyWalking

软件测试领域,分布式系统的复杂性不断增加,如何保证应用程序的高可用性与高性能,这是每一个软件测试工程师所面临的重大挑战。幸运的是,现在有了一些强大的工具来帮助我们应对这些挑战,其中之一便是Apache SkyWalking。…

Ollama windows安装

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

留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB

您列出了一系列编程语言和技术,这些可能是您在留学期间需要学习或完成作业的内容。以下是对每个项目的简要说明和它们可能涉及的领域或用途: Scratch: Scratch是一种图形化编程语言,专为儿童和初学者设计,用于教授编程…

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…

常用符号的英语表达

plus 加号&#xff1b;正号 -  minus 减号&#xff1b;负号  plus or minus 正负号  is multiplied by 乘号  is divided by 除号 &#xff1d; is equal to 等于号 ≠ is not equal to 不等于号 ≡ is equivalent to 全等于号 ≌ is equal to or approximatel…

青少年编程与数学 02-008 Pyhon语言编程基础 02课题、基础概念

青少年编程与数学 02-008 Pyhon语言编程基础 02课题、基础概念 一、标识符二、关键字三、字面量四、变量五、运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 赋值运算符5. 成员运算符6. 身份运算符 六、表达式七、语句八、注释单行注释多行注释文档字符串&#xff08;Docstr…

lanqiaoOJ 2145:求阶乘 ← 二分法

【题目来源】 https://www.lanqiao.cn/problems/2145/learning/ 【题目描述】 满足 N&#xff01;的末尾恰好有 K 个 0 的最小的 N 是多少&#xff1f; 如果这样的 N 不存在输出 -1。 【输入格式】 一个整数 K。 【输出格式】 一个整数代表答案。 【输入样例】 2 【输出样…

vs2013 使用 eigen 库编译时报 C2059 错的解决方法

&#xff08;个人感觉&#xff09;vs2013 就不能使用版本大于等于 3.4 的 eigen&#xff0c;使用 3.3.9 就可以了&#xff0c;再不行就用 3.3.8 另一个博主也遇到过用 vs2013 的时候不能编译 3.4 的 eigen 的问题&#xff0c;不过我用的是 win11&#xff0c;所以感觉跟操作系统…

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

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

智能工厂能耗管理:Python助力节能增效

智能工厂能耗管理:Python助力节能增效 在工业4.0时代,工厂能耗管理已成为制造企业降本增效的重要一环。传统的能耗管理方式往往依赖人工统计和经验决策,导致能源浪费严重。而借助人工智能与Python的强大能力,我们可以实现智能化、数据驱动的能耗优化方案。今天,我们就来聊…

MyBatis 框架:简化 Java 数据持久化的利器

Java学习资料 Java学习资料 Java学习资料 一、引言 在 Java 企业级应用开发中&#xff0c;数据持久化是一个至关重要的环节&#xff0c;它涉及到将应用程序中的数据保存到数据库&#xff0c;以及从数据库中读取数据供应用程序使用。传统的 JDBC 编程虽然可以实现数据持久化&…

[NOI1995] 石子合并

[NOI1995] 石子合并 题目描述 在一个圆形操场的四周摆放 N N N 堆石子&#xff0c;现要将石子有次序地合并成一堆&#xff0c;规定每次只能选相邻的 2 2 2 堆合并成新的一堆&#xff0c;并将新的一堆的石子数&#xff0c;记为该次合并的得分。 试设计出一个算法,计算出将 …