Spring工厂模式

news2024/10/3 0:22:43

 解决方案1:工厂模式

可以使用抽象工厂模式,让StudentDao、StudentService的实现在在工厂中生成,而工厂可以根据配置 文件的指定类型来创建不同的对象,而且工厂本身一般是不变的。从而降低了对可以变的业务逻辑类的 依赖,接近的软件的设计目标”高内聚,低耦合”。控制层-->抽象工厂-->业务逻辑层

public class StudentAction {
/*依赖具体的对象改为依赖工厂, 而工厂创建的路径来自具体的配置文件,所以灵活性大大提高.
* 必须要声明为接口类型,否则工厂没有任何意义(面向接口编程)
* /
private StudentService studentService=
(StudentService)BeanFactory.getBean("studentService");
private Student student;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public String save() {
studentService.save(student);
return "success";
}
}

业务逻辑层-----抽象工厂-----数据访问层

public class StudentServiceImpl implements StudentService {
// 依赖工厂,降低耦合度,可以根据配置灵活修改创建的对象
private StudentDao studentDao=
(StudentDao)BeanFactory.getBean("studentDao");
public void save(Student student) {
studentDao.save(student);
}
}

以上代码就是通过抽象工厂来实现层与层之间的解耦,这种情况下如果想要更新别外一个实现类,只需要修改配置文件就可以了,注意这里只是降低了层与层之间的复杂度,并没有让耦合消失,实际上层与层是不可能没有耦合的。学框架的目标就是要找到变的部分,然后用配置文件来配置这样修改的时候修改配置文件就OK了, 不需要修改代码本身。但是有时候有些类创建的时候需要单例模式, 有的则需要多个实例、还有不同的类在创建的时候有些类需要初始化操作, 有些又不需要初始化数据…..这又怎么办呢?那就要再完善一下这个工厂类了, 或者多创建一些工厂了. 让工厂可以处理这些问题, 但是我们自己实现起来就复杂了

工厂模式
工厂模式 Factory Pattern Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提 供了一种创建对象的最佳方式。在工厂模式中,在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
意图 :定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程
延迟到子类进行。
public class StudentAction {
/*依赖具体的对象改为依赖工厂, 而工厂创建的路径来自具体的配置文件,所以灵活性大大提高.
* 必须要声明为接口类型,否则工厂没有任何意义(面向接口编程)
* /
private StudentService studentService=
(StudentService)BeanFactory.getBean("studentService");
private Student student;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public String save() {
studentService.save(student);
return "success";
}
}

public class StudentServiceImpl implements StudentService {
// 依赖工厂,降低耦合度,可以根据配置灵活修改创建的对象
private StudentDao studentDao=
(StudentDao)BeanFactory.getBean("studentDao");
public void save(Student student) {
studentDao.save(student);
}
}
主要解决 :主要解决接口选择的问题。
何时使用 :我们明确地计划不同条件下创建不同实例时。
优点: 1 、一个调用者想创建一个对象,只要知道其名称就可以了。 2 、扩展性高,如果想增加一
个产品,只要扩展一个工厂类就可以。 3 、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点: 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增
加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
接口
public interface Shape{
public void draw();
}

 多种实现

public class Circle implements Shape{}
public class Square implements Shape{}
public class Rectangle implements Shape{}
最终目标还是需要使用某个实现,但是为了解除耦合引入工厂类,传递工厂类一个名称,由工厂类封装 了具体的创建对象流程
public class ShapeFactory {
//使用 getShape 方法获取形状类型的对象
public Shape getShape(String shapeType){
if(shapeType == null) return null;
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}}
调用 Shape 类型的对象时,调用方并不需要了解具体的实现类,只需要一个名称参数即可
public class Test{
public static void main(String[] args){
Shape shape=ShapeFactory.getShape("circle");
shape.draw():
}
}
这个模式最大的优势在于允许产品扩展
public class MyShape implements Shape{} --- 新产品
扩展产品只需要添加一个对应的工厂类即可
public class MyFactory extends ShapeFactory{
public Shape getShape(String shapeType){
if("my".equalsIgnoreCase(shapeType))
return new MyShape();
else
return super.getShape(shapeType);
}
}
产品可以扩展,但是产品的系列不可扩展,同时可以会导致类爆炸问题

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

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

相关文章

字节青训前端笔记 | 数据可视化基础

本课程主要内容可以分为三个章节: 数据可视化的基本概念可视化设计的基本原则面向前端的可视化工具 本手册可以作为学生学习数据可视化的“学习指南”,按照手册所列内容,结合扩展资料进行系统的学习和实践。本课程没有讨论更为前沿的可视化…

推荐5款干净又实用的软件

我们在使用电脑的时候,总是会用到一些好用的软件,今天分享这5款干净又实用的软件,实在是太好用了,我不允许你不知道。 1.桌面工具——火柴 火柴是一款集快速搜索,程序启动、本地文件查找、网站直达、网络搜索等多种功…

OSACN-Net:使用深度学习和Gabor心电图信号谱图进行睡眠呼吸暂停分类

这篇文章在之前读过一次,其主要的思路就是利用Gabor变换,将心电信号转变为光谱图进行识别研究,总体来讲,不同于其他的利用心电信号分类的算法,该论文将心电信号转换为光谱图,在此基础上,分类问题…

java面试题(二十)中间件redis

1.1 Redis可以用来做什么? 参考答案 Redis最常用来做缓存,是实现分布式缓存的首先中间件;Redis可以作为数据库,实现诸如点赞、关注、排行等对性能要求极高的互联网需求;Redis可以作为计算工具,能用很小的…

基于微信小程序 java高校后勤报修系统 Springboot校园报修管理系统

1绪论 5 1.1项目研究的背景 5 1.2开发意义 5 1.3项目研究内容 5 2开发技术介绍 6 2.1 B/S架构 6 2.2Java技术 6 2.3MySQL 介绍 7 2.4MySQL环境配置 7 2.5SpringBoot技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 9 3.2网站性能需求…

跟开发打了半个月后,我终于get报bug的正确姿势了

在测试人员提需求的时候,大家经常会看到,测试员和开发一言不合就上BUG。然后开发一下就炸了,屡试不爽,招招致命。 曾经看到有个段子这么写道: 不要对程序员说,你的代码有BUG。他的第一反应是:…

C语言学习笔记-强制类型转换

强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型…

《Redis实战篇》六、秒杀优化

6、秒杀优化 6.0 压力测试 目的:测试1000个用户抢购优惠券时秒杀功能的并发性能~ ①数据库中创建1000用户 这里推荐使用开源工具:https://www.sqlfather.com/ ,导入以下配置即可一键生成模拟数据 {"dbName":"hmdp",…

Java中的Set集合

Set不能存储重复元素,元素无序(指的是不按照添加的顺序,List集合是按照添加顺序存储的)hashSet注:源码底层是hashMap实现的,因为hashMap是双列的,其中键是不能重复的,而hashSet是单列…

使用f-string格式化构建字符串

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 字符串的格式化输出(f-string) print(f字符串{变量}字符串) [太阳]选择题 对于以下python代码最后输出的结果是? name "小明" print("【显示】f输出…

全新视角!带你一文读懂ChatGPT!

最了解你的人不是你的朋友,而是你的敌人。 ——《东邪西毒》 目录 什么是ChatGPT? ChatGPT为什么会突然爆红网络? ChatGPT能帮助我们做什么? 获取源码?私信?关注?点赞?收藏&…

记录--千万别让 console.log 上生产!用 Performance 和 Memory 告诉你为什么

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 很多前端都喜欢用 console.log 调试,先不谈调试效率怎么样,首先 console.log 有个致命的问题:会导致内存泄漏。 为什么这么说呢? 用 Performance 和 Mem…

【信管11.4】合同及合同管理过程(二)

合同及合同管理过程(二)合同管理过程不属于项目管理过程中的知识域,所以它也不是 PMP 中的内容。其实截止到这里,整个 PMP 中的相关知识你已经学完了。如果抛开我们第一大章信息化和信息管理相关的内容,你就可以直接去…

Spring Boot(五十九):Sa-Token-Quick-Login插件快速登录认证

1 Sa-Token-Quick-Login解决的问题 Sa-Token-Quick-Login 可以为一个系统快速的、零代码 注入一个登录页面 试想一下,假如我们开发了一个非常简单的小系统,比如说:服务器性能监控页面, 我们将它部署在服务器上,通过访…

Docker不做虚拟化内核,对.NET有什么影响?

引子前两天刷抖音,看见了这样一个问题。问题:容器化不做虚拟内核,会有什么弊端?Java很多方法会跟CPU的核数有关,这个时候调用系统函数,读到的是宿主机信息,而不是我们限制资源的大小。思考&…

FoveaBox原理与代码解析

paper:FoveaBox: Beyond Anchor-based Object Detectorcode:https://github.com/taokong/FoveaBox背景基于anchor的检测模型需要仔细设计anchor,常用方法之一是根据特定数据集的统计结果确定anchor的number、scale、ratio等,但这种…

elasticsearch8.3.2搭建部署

Elasticsearch8.3.2搭建部署详细步骤 0.过往文章 ES-6文章: Elasticsearch6.6.0部署、原理和使用介绍: https://blog.csdn.net/wt334502157/article/details/119515730 ES-7文章: Elasticsearch7.6.1部署、原理和使用介绍: https://blog.csdn.net/wt…

堆排序

章节目录:一、相关概述1.1 基本介绍1.2 排序思想二、基本应用2.1 步骤说明2.2 代码示例三、结束语一、相关概述 1.1 基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。它的最坏最好平均时间复杂度均为 O(nlogn)&#x…

(深度学习快速入门)第五章第二节:GAN变体

文章目录一:CycleGAN(1)概述(2)双判别器(3)损失函数二:StyleGAN(1)解耦表征学习(2)概述三:DCGAN一:CycleGAN …

4.5.8 Set接口与HashSet

文章目录1.概述2.Set集合的特点3.常用方法4.HashSet4.1 概述4.2 练习: Set相关测试一4.3 练习: Set相关测试二1.概述 Set是一个不包含重复数据的CollectionSet集合中的数据是无序的(因为Set集合没有下标)Set集合中的元素不可以重复 – 常用来给数据去重 2.Set集合的特点 数据…