Java面试题·解释题·单例模式、工厂模式、代理模式部分
系列文章目录
Java面试题·解释题·JavaSE部分
Java面试题·解释题·框架部分
Java面试题·解释题·单例模式、工厂模式、代理模式部分
文章目录
- 系列文章目录
- 前言
- 一、设计模式
- 1. 单例模式
- 1.1 单例模式的定义
- 1.2 单例模式的实现方法
- 2. 工厂模式
- 2.1 工厂模式的定义
- 2.2 工厂模式的实现方法
- 2.3 工厂模式的好处
- 2.4 工厂模式的使用场景
- 3. 代理模式
- 3.1 代理模式的定义
- 3.2 代理模式的实现方法
- 3.3 代理模式的好处
- 3.4 动态代理以及静态代理的区别
- 3.4.1 静态代理
- 3.4.2 动态代理
- 3.4.3 动态代理和静态代理的区别
- 总结
前言
本文将介绍:
单例模式、
工厂模式、
代理模式
本文主要介绍以上部分的面试题。
一、设计模式
设计模式是为了专门解决特定问题的模板,如果需求符合问题,设计模式能更简单、更正确的解决问题。
1. 单例模式
1.1 单例模式的定义
单例模式:该类能且仅能出现一个对象;该类必须自行创建该对象;该类必须将对象提供给外部。
该类只能有一个实例:此类只提供私有的构造函数;
该类必须自行创建该对象:此类定义中有一个私有静态的对象;
该类必须将对象提供给外部:此类定义中有静态公有方法能够创建并获取到静态私有对象并返回;
创建的方法和获取的方法可以是同一个方法
1.2 单例模式的实现方法
饿汉式:饿汉式是在类加载时就进行初始化。它的实现方法是在类加载的时候就创建并初始化。
饿汉式的特点是线程安全、浪费资源。
懒汉式:懒汉式是在首次使用时进行初始化。懒汉式的实现方法是在需要时进行延迟初始化。
懒汉式的特点是线程不安全、节省资源、需要考虑多线程环境下的同步问题。
静态内部类:静态内部类是在内部类被加载和初始化时,才创建单例对象。每次访问静态内部类的静态成员时,静态内部类只会被加载一次,之后的访问将直接返回已创建的实例。
静态内部类结合了饿汉式和懒汉式的优点,既可以实现延迟加载,又能保证线程安全。
2. 工厂模式
2.1 工厂模式的定义
工厂模式:用于封装对象的创建过程,将对象的实例化过程与使用过程分离。
定义一个工厂类,该类负责根据客户端的需求创建具体的对象,并将对象返回给客户端使用。客户端通过调用工厂类的方法来获取对象,而无需直接依赖于具体的对象实现类。
2.2 工厂模式的实现方法
抽象产品(Abstract Product):定义产品的共同接口,可以是抽象类或接口。
具体产品(Concrete Product):实现抽象产品接口,是工厂所创建的对象。
工厂类(Factory Class):负责创建具体产品对象的类。根据客户端传入的参数决定创建哪种对象。
简单工厂模式的优点包括:
2.3 工厂模式的好处
封装对象的创建过程,客户端只需要关心产品的接口,无需关心具体的实现类。
可以通过工厂类来集中管理和控制对象的创建,提供更高的灵活性和可维护性。
可以通过工厂类来隐藏具体产品的实现细节,对客户端代码进行解耦,提供更好的扩展性。
简单工厂模式的缺点是当需要添加新的产品时,需要修改工厂类的代码,违反了开闭原则。同时,工厂类集中了所有产品的创建逻辑,可能导致工厂类的代码变得庞大而复杂。
2.4 工厂模式的使用场景
需要创建一组相关对象的场景,这些对象共享相同的接口或基类。
需要隐藏对象创建的具体细节,只暴露产品的接口给客户端。
需要根据不同的条件创建不同的对象。
3. 代理模式
3.1 代理模式的定义
代理模式的核心思想是通过一个代理对象来间接访问目标对象,代理对象和目标对象实现了相同的接口或继承了相同的父类,以便代理对象可以完全替代目标对象。
3.2 代理模式的实现方法
抽象对象接口(Subject):定义了目标对象和代理对象的共同接口,可以是抽象类或接口。
目标对象(Real Subject):定义了代理对象所代表的真实对象,是客户端真正要访问的对象。
代理对象(Proxy):持有目标对象的引用,并在访问目标对象之前或之后进行一些额外的操作。
3.3 代理模式的好处
代理模式可以在不改变目标对象的前提下,通过引入代理对象来对目标对象进行扩展或增强。
代理模式可以实现客户端和目标对象之间的解耦,客户端只需要通过代理对象来访问目标对象,无需关心具体的实现细节。
代理模式可以在访问目标对象之前或之后添加一些额外的操作,如权限控制、缓存、日志记录等。(AOP)
3.4 动态代理以及静态代理的区别
动态代理和静态代理都是代理模式的具体实现方式,用于控制对目标对象的访问。它们的主要区别在于代理类的生成方式和访问方式。
3.4.1 静态代理
静态代理是在编译时创建代理类,在编码阶段就已经确定了代理对象和目标对象的关系。在静态代理中,需要手动编写代理类,代理类和目标类都实现了同一个接口或继承了同一个父类。代理类持有目标对象的引用,并在方法调用前后进行一些额外的操作。静态代理的优点是简单直接,易于理解和实现。但是,静态代理的缺点是在代理类和目标类之间存在强耦合,如果需要代理多个类,就需要编写多个代理类。
3.4.2 动态代理
动态代理是在运行时动态生成代理类,无需手动编写代理类。动态代理利用Java的反射机制,在运行时动态地创建代理类和代理对象。在动态代理中,代理对象通过实现InvocationHandler接口来定义代理类的行为。当调用代理对象的方法时,会被重定向到InvocationHandler的invoke方法,并在该方法中执行一些额外的操作。动态代理的优点是可以代理多个类,通过同一个代理类来完成对不同目标对象的访问。但是,动态代理的缺点是相对于静态代理来说,实现更加复杂。
3.4.3 动态代理和静态代理的区别
代理类的生成方式:静态代理在编译时创建代理类,需要手动编写代理类;而动态代理是在运行时动态生成代理类,无需手动编写代理类。
对象的访问方式:静态代理的访问方式在编译时确定,代理对象对目标对象的访问是静态的;而动态代理的访问方式在运行时确定,代理对象对目标对象的访问是动态的。
扩展性:静态代理需要为每个目标对象编写一个代理类,扩展性较差;而动态代理可以适用于多个目标对象,通过同一个代理类来完成对不同目标对象的访问,扩展性较好。
总结
以上是单例模式、工厂模式、代理模式部分的解释题,感谢各位客官收看。
相关文章:
Java面试题·解释题·单例模式、工厂模式、代理模式部分
系列文章目录 Java面试题解释题JavaSE部分 Java面试题解释题框架部分 Java面试题解释题单例模式、工厂模式、代理模式部分 文章目录 系列文章目录前言一、设计模式1. 单例模式1.1 单例模式的定义1.2 单例模式的实现方法 2. 工厂模式2.1 工厂模式的定义2.2 工厂模式的实现方法2…...

如何编写智能合约——基于长安链的Go语言的合约开发
场景设计:文件存证系统 在数字化时代,文件存证和版本追踪变得越来越重要。设想一个场景:在一个法律事务管理系统中,用户需要提交和管理各种文件的版本记录,以确保每个文件在不同时间点的状态可以被准确追踪。文件可能经…...

【PHP代码审计】PHP基础知识
🌝博客主页:菜鸟小羊 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 php简介 php是什么? php(全称:Hypertext Preprocessor,即超文本预处理器&…...

大模型笔记03--快速体验dify
大模型笔记03--快速体验dify 介绍部署&测试部署 dify测试dify对接本地ollama大模型对接阿里云千问大模型在个人网站中嵌入dify智能客服 注意事项说明 介绍 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)…...

Linux常用命令以及操作技巧
🌏个人博客主页:意疏-CSDN博客 希望文章能够给到初学的你一些启发~ 如果觉得文章对你有帮助的话,点赞 关注 收藏支持一下笔者吧~ 阅读指南: 开篇说明帮助命令常见的七个linux操作终端实用的技巧跟文件目录…...

C语言 | Leetcode C语言题解之题409题最长回文串
题目: 题解: int longestPalindrome(char * s) {int c[128]{0},ret0;for(int i0;i<strlen(s);i){c[s[i]];}for(int i0;i<128;i){retc[i]-c[i]%2;}return ret(ret!strlen(s)); }...
FreeSql 全面指南:从基础到高级实战,深入解析读写分离与导航属性
FreeSql 使用详解:从入门到高级 FreeSql 是一个开源的、轻量级的 ORM 框架,它为 .NET 开发人员提供了丰富的功能,包括 CRUD 操作、读写分离、多租户、导航属性支持等。相比于 Entity Framework Core,FreeSql 在性能和特性上有一些…...
深度学习之微积分预备知识点
极限(Limit) 定义:表示某一点处函数趋近于某一特定值的过程,一般记为 极限是一种变化状态的描述,核心思想是无限靠近而永远不能到达 公式: 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…...

动态内存
动态内存分配函数:在程序运行时为变量或数据结构开辟的内存空间的函数。 有三个重要的动态分配函数:malloc、calloc、realloc。 动态内存分配函数 malloc 这个函数是向内存中申请一块连续的空间,返回一个指向这个块空间的指针。 如果开辟成…...

C/C++实现植物大战僵尸(PVZ)(打地鼠版)
🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主,后期持续更新系列文章 🚀如果有错误感谢请大家批评指出,及时修改 🚀感谢大家点赞👍收藏⭐评论✍ 游戏…...
C++ 科目二 智能指针 [weak_ptr] (解决shared_ptr的循环引用问题)
shared_ptr引入的重复计数问题,导致内存泄漏 using namespace std; class CFather; class CSon;class CFather { public:CFather(){}void Set(shared_ptr<CSon> pson){Pson pson;}shared_ptr<CSon> Pson; };class CSon { public:CSon(){}void Set(sha…...

解决RabbitMQ设置TTL过期后不进入死信队列
解决RabbitMQ设置TTL过期后不进入死信队列 问题发现问题解决方法一:只监听死信队列,在死信队列里面处理业务逻辑方法二:改为自动确认模式 问题发现 最近再学习RabbitMQ过程中,看到关于死信队列内容: 来自队列的消息可…...
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel() 源码分析
【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel 源码分析 系列文章汇总:《鸿蒙OH-v5.0源码分析之 Uboot+Kernel 部分】000 - 文章链接汇总》 本文链接:《【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_ke…...

EndnoteX9安装及使用教程
EndnoteX9安装及使用教程 一、EndNote安装 1.1 下载 这里提供一个下载链接: 链接:https://pan.baidu.com/s/1RlGJksQ67YDIhz4tBmph6Q 提取码:5210 解压完成后,如下所示: 1.2 安装 双击右键进行安装 安装比较简单…...
SQL:子查询
子查询是SQL中强大的功能之一,它允许在一个查询内部嵌套另一个查询,以便处理更复杂的逻辑或数据检索需求。子查询可以用在SELECT、FROM、WHERE、HAVING、IN、ANY、ALL等子句中,根据使用场景和目的的不同,子查询可以分为多种类型。…...

C语言刷题日记(附详解)(5)
一、选填部分 第一题: 下面代码在64位系统下的输出为( ) void print_array(int arr[]) {int n sizeof(arr) / sizeof(arr[0]);for (int i 0; i < n; i)printf("%d", arr[i]); } int main() {int arr[] { 1,2,3,4,5 };print_array(arr);return 0; } A . 1…...
开源加密软件简介
开源加密软件是指源代码公开、可供任何人查看、修改和分发的加密软件。这类软件通常由社区维护,具有高度的透明性和安全性。 1. GnuPG (GNU Privacy Guard) 简介:GnuPG是一种基于OpenPGP标准的加密和签名工具,广泛应用于电子邮件加密和文件…...

【C++学习】 IO 流揭秘:高效数据读写的最佳实践
✨ 今朝有酒今朝醉,明日愁来明日愁 🌏 📃个人主页:island1314 🔥个人专栏:C学习 ⛺️ 欢迎关注:👍点赞 👂Ἷ…...

C#使用TCP-S7协议读写西门子PLC(五)-测试程序
上面四篇我们进行封装连接PLC以及读写PLC内存地址表 C#使用TCP-S7协议读写西门子PLC(一)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(二)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(四)-CSDN博客 这里我们进行测试操作 西门子PLC-…...

经验——IMX6UL的uboot无法ping主机或Ubuntu
主要描述可能的方向,不涉具体过程,详细操作可以查阅网上相关教程 跟随正点原子教程测试以太网端口时,即便按照步骤多次尝试也无法ping通,后补充了些许网络工程基础知识解决了这个问题。 uboot无法ping主机或Ubuntu有多种可能&…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...