当前位置: 首页 > 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有多种可能&…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...