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

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题最长回文串

题目&#xff1a; 题解&#xff1a; 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 使用详解&#xff1a;从入门到高级 FreeSql 是一个开源的、轻量级的 ORM 框架&#xff0c;它为 .NET 开发人员提供了丰富的功能&#xff0c;包括 CRUD 操作、读写分离、多租户、导航属性支持等。相比于 Entity Framework Core&#xff0c;FreeSql 在性能和特性上有一些…...

深度学习之微积分预备知识点

极限&#xff08;Limit&#xff09; 定义&#xff1a;表示某一点处函数趋近于某一特定值的过程&#xff0c;一般记为 极限是一种变化状态的描述&#xff0c;核心思想是无限靠近而永远不能到达 公式&#xff1a; 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…...

动态内存

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

C/C++实现植物大战僵尸(PVZ)(打地鼠版)

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 游戏…...

C++ 科目二 智能指针 [weak_ptr] (解决shared_ptr的循环引用问题)

shared_ptr引入的重复计数问题&#xff0c;导致内存泄漏 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过期后不进入死信队列 问题发现问题解决方法一&#xff1a;只监听死信队列&#xff0c;在死信队列里面处理业务逻辑方法二&#xff1a;改为自动确认模式 问题发现 最近再学习RabbitMQ过程中&#xff0c;看到关于死信队列内容&#xff1a; 来自队列的消息可…...

【鸿蒙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 下载 这里提供一个下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1RlGJksQ67YDIhz4tBmph6Q 提取码&#xff1a;5210 解压完成后&#xff0c;如下所示&#xff1a; 1.2 安装 双击右键进行安装 安装比较简单…...

SQL:子查询

子查询是SQL中强大的功能之一&#xff0c;它允许在一个查询内部嵌套另一个查询&#xff0c;以便处理更复杂的逻辑或数据检索需求。子查询可以用在SELECT、FROM、WHERE、HAVING、IN、ANY、ALL等子句中&#xff0c;根据使用场景和目的的不同&#xff0c;子查询可以分为多种类型。…...

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…...

开源加密软件简介

开源加密软件是指源代码公开、可供任何人查看、修改和分发的加密软件。这类软件通常由社区维护&#xff0c;具有高度的透明性和安全性。 1. GnuPG (GNU Privacy Guard) 简介&#xff1a;GnuPG是一种基于OpenPGP标准的加密和签名工具&#xff0c;广泛应用于电子邮件加密和文件…...

【C++学习】 IO 流揭秘:高效数据读写的最佳实践

✨ 今朝有酒今朝醉&#xff0c;明日愁来明日愁 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3f…...

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

主要描述可能的方向&#xff0c;不涉具体过程&#xff0c;详细操作可以查阅网上相关教程 跟随正点原子教程测试以太网端口时&#xff0c;即便按照步骤多次尝试也无法ping通&#xff0c;后补充了些许网络工程基础知识解决了这个问题。 uboot无法ping主机或Ubuntu有多种可能&…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

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 赋能关键领域软件质量保障

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