Spring:工厂模式哪里解耦了?
菜瓜:我一定是太菜了,为什么别人说Spring屏蔽了new关键字创建对象就很丝滑?我完全get不到这个操作的好处啊,我自己写new它也很香啊
水稻:emmmm,换个角度想啊,如果把现在用的注解@Autowired@Resource给干掉,你想在Controller里面引用Service,你会怎么做?new 一个?
菜瓜:对啊,我new一个怎么了,不也可以用?
水稻:那如果,我另一个Controller里面也要用同一个Service,是不是再new一个?有很多个这种Controller是不是new很多个Service?
菜瓜:这。。。我有另一个方法,把Service放在一个容器里,Controller用的时候从容器里面拿?
水稻:哇塞,Spring应该请你去写他们的框架啊
菜瓜:Spring是这么做的?
水稻:不知道你听没听过简单工厂这种设计模式,用于将对象的创建和使用隔离开来,达到解耦的目的。工厂负责创建对象,并且可以干预创建的逻辑
菜瓜:嗯,简单工厂,工厂方法,抽象工厂我都略懂?
水稻:。。。。Talk is cheap , show me your code ! 就简单工厂就行了
菜瓜:下面这样的
package club.interview.design_pattern.chapt2_factory_pattern; /**
* @author QuCheng on 2020/6/13.
*/
public class SimpleFactory { abstract static class AbstractPhone {
abstract void call();
} static class XiaoMi extends AbstractPhone {
@Override
void call() {
System.out.println("小米手机打电话。。。。");
}
} static class Meizu extends AbstractPhone {
@Override
void call() {
System.out.println("魅族手机打电话。。。。");
}
} public AbstractPhone getPhone(String phoneType) {
if ("小米".equals(phoneType)) {
return new XiaoMi();
} else if ("魅族".equals(phoneType)) {
return new Meizu();
}
return null;
} public static void main(String[] args) {
SimpleFactory s = new SimpleFactory();
s.getPhone("小米").call();
s.getPhone("魅族").call();
} }
水稻:那你肯定知道,这种写法的局限性。依靠phoneType来创建对象不利于扩展。如果现在的需求生产的对象不限定返回类型,给啥就创建啥,怎么做
菜瓜:动态创建对象?那不是反射吗?是不是这样
package club.interview.design_pattern.chapt2_factory_pattern; /**
* @author QuCheng on 2020/6/13.
*/
public class SpringFactory { static class XiaoMi {
void call() {
System.out.println("小米手机打电话。。。。");
}
} static class Meizu {
void call() {
System.out.println("魅族手机打电话。。。。");
}
} static class HuaWei {
void call() {
System.out.println("华为手机打电话。。。。");
}
} public <T> T getPhone(Class<T> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
} public static void main(String[] args) {
SpringFactory s = new SpringFactory();
s.getPhone(XiaoMi.class).call();
s.getPhone(Meizu.class).call();
s.getPhone(HuaWei.class).call();
} }
水稻:秀啊!!厉害厉害。相比你也知道,此时如果我想在创建过程中加入一点点自己的逻辑,那也是很丝滑的。
菜瓜:哦,原来是这样。Spring利用工厂将对象的创建和使用进行隔离,还可以定制一些bean对象的创建逻辑。学到了,学到了。
水稻:我也学到了,反射和设计模式用的6啊。当然,Spring的工厂远没有你现在想的这么简单。你再仔细品品
总结:
- Spring利用反射创建对象,并将创建好的对象放入一个大工厂,实现了对象创建和使用的解耦。后需要使用的时候可以方便的通过BeanFactory.getBean()获取。在此之上还扩展了堆注解的支持,使用注解就可以注入对象。这就是传说中的DI(Dependency Inject)依赖注入
Spring:工厂模式哪里解耦了?的更多相关文章
- Spring中如何使用工厂模式实现程序解耦?
目录 1. 啥是耦合.解耦? 2. jdbc程序进行解耦 3.传统dao.service.controller的程序耦合性 4.使用工厂模式实现解耦 5.工厂模式改进 6.结语 @ 1. 啥是耦合.解 ...
- Spring 实现两种设计模式:工厂模式和单态模式(单例模式)
本文摘自:李刚 著 <轻量级 Java EE企业应用实战 Struts2+Spring+hibernate整合开发> 在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工 ...
- PHP 工厂模式介绍
工厂模式,顾名思义,如同工厂一样,你把原材料放入工厂中,出来的是成品,而你并不需要知道工厂里做了什么.代码中也类似,把主要参数放入一个工厂里,返回的是处理好的数据,我们并不需要工厂里做了什么,只需要知 ...
- Java工厂模式解耦 —— 理解Spring IOC
Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...
- 简单工厂模式,工厂方法模式,抽象工厂模式,spring的狂想
菜鸟D在项目中遇见一个比较纠结的高耦合,所以就想办法来解耦.情况是这样的:系统通过用户选择treeview控件的节点判断调用不同的处理,这些处理中某些东西又是类似的.同事的建议是采用简单工厂,耦合就耦 ...
- 使用工厂模式解耦和IoC思想
使用工厂模式解耦. 一.需求场景: 某一层功能需要改动,但其他层代码不变 实现类1:MyDaoImpl查询自己的数据库. ====改为====> 实现类2:MyDaoImpl2从其它地址得到数据 ...
- 应聘阿里,字节跳动,美团必须掌握的Spring IOC与工厂模式
Spring IOC与工厂模式 PS:本文内容较为硬核,需要对java的面向对象.反射.类加载器.泛型.properties.XML等基础知识有较深理解. (一)简单介绍 在讲Spring IOC之前 ...
- 工厂模式模拟Spring的bean加载过程
一.前言 在日常的开发过程,经常使用或碰到的设计模式有代理.工厂.单例.反射模式等等.下面就对工厂模式模拟spring的bean加载过程进行解析,如果对工厂模式不熟悉的,具体可以先去学习一下工厂 ...
- Spring中的工厂模式和单例模式
Spring预备知识(适合中小型项目) 作用:集成和管理其他框架 工厂模式: A a = new A( ); 将类所要创建的对象写入工厂,统一进行管理 package com.spring; pu ...
随机推荐
- J2EE项目中,servlet跳转到相应的JSP页面后,JSP页面丢失了样式效果
原因: js和css的引用路径是相对路径.跳转后路径改变. 解决方法: 先在head标签中加入一下代码 <% String path = request.getContextPath(); St ...
- 实验四:Linux系统C语言开发环境学习
项目 内容 这个作业属于哪个课程 班级课程主页链接 这个作业的要求在哪里 作业要求 学号-姓名 17043133-木腾飞 作业学习要求 1.学习Linux系统中如何查看帮助文档:2.在Linux系统中 ...
- JavaScript之倔强的字符串
关于倔强的JavaScript字符串:不可以被修改 我们是字符串 我们的口号是:你可以消灭我,但是你不能改变我 JavaScript字符串是不可改变的,当真是这样的吗? 让我们来试验一下. var n ...
- Spring Cloud 学习笔记一
一.spring cloud 搭建注册中心(Eureka server) 1.spring cloud中提供了多种分步式服务组件,其都依赖于注册中心(eureka),注册中心的服务者与发现者都通过Eu ...
- Matlab矩阵学习一 矩阵的创建
Matlab矩阵创建 1.直接输入数值创建 矩阵元素要用[ ] 括起来,";"代表一行结束,以下创建方式也是合法的,矩阵的元素可以是实数,也可以是复数,复数用a+bi表 ...
- Unity 游戏框架搭建 2019 (五十二~五十四) 什么是库?&第四章总结&第五章简介
在上一篇,我们对框架和架构进行了一点探讨.我们在这一篇再接着探讨. 什么是库呢? 来自同一位大神的解释: 库, 插到 既有 架构 中, 补充 特定 功能. 很形象,库就是搞这个的.我们的库最初存在的目 ...
- Beta冲刺 ——5.27
这个作业属于哪个课程 软件工程 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.会议内容 1.组员一起学习Git分支管 ...
- Spring (一 ) 概述与介绍
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 目录 1.Spring概述 2.Spring的模块介绍 Spring框架分为四大模块: 3.Eclips ...
- Java 蓝桥杯 算法训练(VIP) 最大体积
最大体积 问题描述 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积. 假如每个物品有无限件可用,那么有些体积是永远也装不出来的. 为了尽量装满背包,附中的OIER想要研究一下 ...
- Java实现 LeetCode 529 扫雷游戏(DFS)
529. 扫雷游戏 让我们一起来玩扫雷游戏! 给定一个代表游戏板的二维字符矩阵. 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线) ...