设计模式面试系列-02

1. Java 中工厂模式有什么优势?

1、工厂模式是最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。

2、利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。

3、将选择实现类、创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。

2. 说说你理解的 Spring 中工厂模式?

Spring IOC

看过Spring源码就知道,在Spring IOC容器创建bean的过程是使用了工厂设计模式。

Spring中无论是通过xml配置还是通过配置类还是注解进行创建bean,大部分都是通过简单工厂来进行创建的。

当容器拿到了beanName和class类型后,动态的通过反射创建具体的某个对象,最后将创建的对象放到Map中。

3. 为什么 Spring IOC 要使用工厂模式创建 Bean?

在实际开发中,如果A对象调用B,B调用C,C调用D的话,程序的耦合性就会变高。耦合大致分为类与类之间的依赖,方法与方法之间的依赖。

以前三层架构编程时,都是控制层调用业务层,业务层调用数据访问层时,都是是直接new对象,耦合性大大提升,代码重复量大、冗余高,对象也是创建比较随意。

为了避免这种情况,Spring使用工厂模式编写一个工厂,由工厂创建Bean,以后如果要对象就直接管工厂要就可以。

Spring IOC容器的工厂中有个静态的Map集合,是为了让工厂符合单例设计模式,即每个对象只生产一次,生产出对象后就存入到Map集合中,保证了实例不会重复影响程序效率。

4. Java 中工厂模式分为哪几大类?

工厂模式分为三类,如下:

1)简单工厂模式(Simple Factory),又称静态工厂方法模式,是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的, 不利于产生系列产品;

2)工厂方法模式(Factory Method),又称为多形性工厂是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成;

3)抽象工厂模式(Abstract Factory),又称为工具箱,提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构,产生产品族但不利于产生新的产品,而工厂方法模式针对的是一个产品的等级结构。

5. Java 中什么是简单工厂模式?

简单工厂模式又称静态工厂方法模式,在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化,如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。

简单工厂模式的具体组成如下:

1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品。

2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。

3)具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

下面举例猫与狗吃饭的故事,具体代码实现如下:

1)创建共用接口,代码如下:

package com.yoodb;public interface Dinner{public void eat();
}

2)创建实现类,代码如下:

package com.yoodb;public class CatDinner implements Dinner{@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("小猫来吃饭了!");}}

package com.yoodb;public class DogDinner implements Dinner{@Overridepublic void eat() {// TODO Auto-generated method stubSystem.out.println("小狗来吃饭了!");}}

3)创建工厂,代码如下:

package com.yoodb;public class DinnerFactory {public Dinner produce(String animal){if(animal.equals("cat")){return new CatDinner();}else if(animal.equals("dog")){return new DogDinner();}else{System.out.println("请输入存在的动物!");  

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

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

相关文章

读懂2024年数字孪生发展新趋势!十大权威白皮书放送!

2024年,数字孪生 该往哪些方向走? 新技术的不断涌现 又会带来怎样的行业变迁 …… 在开工之际,我们整理了 51WORLD主导、参编的 十大权威数字孪生白皮书、行业报告 以及产业优秀案例集 分享给想要提升自我的朋友们 读完这些 上面看似…

嵌入式23——IO

时间获取: 1.time time_t time(time_t *tloc);// 定义 time_t t 用来存放秒数,不能定义一个time_t *t 流指针 原因:流指针为野指针,它的指向不明确,没有一块空间用来存放秒数 即使将流指针初始为NULL,也…

singularity-ce-4.1.0 + go 完整安装步骤,及报错解决

singularity-ce-4.1.0 go 1.20 完整安装步骤. 解决bug: checking: host Go compiler (at least version 1.13)... not found! mconfig: could not complete configuration服务器基础环境: 阿里云服务器: > lsb_release -a LSB Version: :core-4.…

道可云元宇宙每日资讯|杭州:重点培育元宇宙、智能型机器人等

道可云元宇宙每日简报(2024年2月20日)讯,今日元宇宙新鲜事有: 杭州:重点培育元宇宙、智能型机器人等 昨日,杭州市人民政府发布《关于进一步推动经济高质量发展的若干政策》。政策指出,以通用人…

不止提升免疫力?NMN或可预防、缓解支原体肺炎造成的肺部损伤

近期,全国多地进入呼吸道疾病高发季,支原体肺炎等相关话题频频登上各大热搜榜。 发烧、咳嗽、嗓子疼、肺炎……支原体肺炎的战线拉得挺长,过年了都还有不少人纷纷中招:发热、咳嗽,来来回回拖了一两周才好,…

JavaScript 设计模式之组合模式

组合模式 在我们日常中肯呢个会将一个表单用这种模式来创建 const Car function () { } Car.prototype.getName function () { throw new Error("需要重写该方法") } Car.prototype.getPrice function () {throw new Error("需要重写该方法") } const…

突破性创新:OpenAI推出Sora视频模型,预示视频制作技术的未来已到来!

一、前言 此页面上的所有视频均由 Sora 直接生成,未经修改。 OpenAI - Sora is an AI model that can create realistic and imaginative scenes from text instructions. 2024 年 2 月 16 日,OpenAI 发布 AI 视频模型 Sora,60 秒的一镜到底…

XML Map 端口进阶篇——常用关键字和格式化器详解

XML Map 端口是用于在不同XML之间建立关系映射的工具,允许通过拖拽操作实现源XML和目标 XML之间的数据字段映射,除此之外,XML Map 端口还提供了其它丰富多彩的功能,使用户能够更加灵活和高效的处理XML 数据映射任务,让…

以程序员的视角,看前后端分离的是否必要?

Hello,我是贝格前端工场,本篇分享一个老生常谈的话题,前后端分离是必然趋势,但也是要区分具体的场景,欢迎探讨,关注,有前端开发需求可以私信我,上车了。 一、什么是前后端分离和不分…

Bert-VITS-2 效果挺好的声音克隆工具

持中日英三语训练和推理。内置干声分离,切割和标注工具,开箱即用。请点下载量右边的符号查看镜像所对应的具体版本号。 教程地址: sjj​​​​​​​CodeWithGPU | 能复现才是好算法CodeWithGPU | GitHub AI算法复现社区,能复现…

分享一个背英语单词的方法

目录 前言 乱序记忆法 结语 前言 这是我现在正在用的背单词方法,我觉得是不错的,分享一下,希望对你有帮助。也欢迎评论点赞哟。 乱序记忆法 这种方法需要我们准备好纸,是需要我们动笔的。我坚持认为,动笔去记单词的…

人工智能专题: Sora,世界模拟器的视频生成器

今天分享的是人工智能系列深度研究报告:《人工智能专题: Sora,世界模拟器的视频生成器》。 (报告出品方:华泰证券) 报告共计:16页 来源:人工智能学派 Sora 能做什么?…

苍穹外卖——第一天nginx

放到全是英文路径的打不开 到安装路径进入cmd,输入nginx -t nginx: the configuration file E:\Astudy\nginx-1.20.2/conf/nginx.conf syntax is ok nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbid…

Fiddler工具 — 18.Fiddler抓包HTTPS请求(一)

1、Fiddler抓取HTTPS过程 第一步:Fiddler截获客户端发送给服务器的HTTPS请求,Fiddler伪装成客户端向服务器发送请求进行握手 。 第二步:服务器发回相应,Fiddler获取到服务器的CA证书, 用根证书(这里的根证…

c# Contains方法-检查集合中是否包含指定的元素

Contains 是 .NET 集合框架中许多集合类&#xff08;如 List、Array、HashSet 等&#xff09;提供的一种方法&#xff0c;用于检查集合中是否包含指定的元素。对于 List<int> 类型&#xff0c;Contains 方法会遍历列表中的所有元素&#xff0c;并判断传入的方法参数是否存…

UI自动化之使用poco进行元素的唯一定位

直接选择&#xff1a; 1.poco(text买入).click() 2.poco("android.widget.ImageView").click()相对选择、空间选择&#xff1a; 3.poco(text/name).parent().child()[0].click()正则表达式&#xff1a; 4.listpoco(textMatches".*ETF")今天主要想记录下…

c编译器学习05:与chibicc类似的minilisp编译器(待续)

minilisp项目介绍 项目地址&#xff1a;https://github.com/rui314/minilisp 作者也是rui314&#xff0c;commits也是按照模块开发提交的。 minilisp只有一个代码文件&#xff1a;https://github.com/rui314/minilisp/blob/master/minilisp.c 加注释也只有996行。 代码结构&a…

《剑指Offer》笔记题解思路技巧优化 Java版本——新版leetcode_Part_5

《剑指Offer》笔记&题解&思路&技巧&优化_Part_5 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题&#x1f7e2;1. LCR 158. 库存管理 II——数组中出现次数超过一…

vue.js前端框架应用案例

Vue.js 是一种流行的前端框架&#xff0c;它可以帮助开发者构建单页应用&#xff08;SPA&#xff09;和复杂的用户界面。以下是几个 Vue.js 的案例&#xff0c;涵盖了不同领域的应用&#xff1a; Vue.js 官方文档&#xff1a;Vue.js 的官方文档本身就是一个使用 Vue.js 构建的…

SQL数据库基础语法-增删改

SQL数据库基础语法-增删改 数据库是 ​ “按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 GeekSec专注技能竞赛培训5年&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;…