spring中设计模式
MVC模式 |
Model:pojo、数据库交互(业务数据和业务逻辑)
View:Jsp(与用户交互页面)
Controller:控制器(接收请求并决定调用哪个模块组件去处理请求,然后决定调用哪个视图(通过转发或重定向)来显示返回的数据)
单例模式 |
[**点击查看各种单例模式实现方法**](https://blog.csdn.net/csdn_conda/article/details/80285280)
利用双重检查锁定(Double-Checked Locking)来降低同步的开销
```
public class Singleton {
private static volatile Singleton sInstance = null;
private Singleton () {
}
public static Singleton getInstance () {
if (sInstance == null) {
Synchronized(Singleton.class){
if (sInstance == null) {
sInstance = new Singleton();
}
}
}
return sInstance;
}
}
**为什么需要用<span style="color:red;">volatile</span>修饰变量sInstance ?**
因为sInstance = new Singleton();这行代码实际上做了以下工作:
memory = allocate(); // 1:分配对象的内存空间
ctorInstance(memory); // 2:初始化对象
instance = memory; // 3:设置instance指向刚分配的内存地址
1、2、3指令可能会重排序为1、3、2,将导致外层判断出instance不为空,该线程接下来将访问instance引用的对象,而此对象事实上是一个还未初始化的对象。故需要加修饰,可以确保外层null检查要么看到的是null,要么看到的是一个构造完整的对象。
volatile可以保证有序性和可见性(即读操作在写操作之前)。
<table><tr><td bgcolor=#B0C4DE>工厂模式</td></tr></table>
[**点击查看三种工厂模式详解**](https://www.cnblogs.com/zailushang1996/p/8601808.html)
<span style="color:red;"> 简单工厂:</span>是一个具体的类,有一个重要的create()方法,根据入参判断new哪个实例,不符合开闭原则,扩展性差,新增需要修改工厂类方法。create()方法通常是静态的,所以也称之为静态工厂。
<span style="color:red;"> 工厂方法:</span>提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。利用多态性
<span style="color:red;"> 抽象工厂:</span>是可以生产多个产品的,而工厂方法模式则只能生产一个产品。
<table><tr><td bgcolor=#B0C4DE>适配器模式</td></tr></table>
[***点击查看适配器模式详解***](https://www.cnblogs.com/V1haoge/p/6479118.html)
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作,类似生活中转接头的概念。
<span style="color:red;"> 类适配器模式:</span>通过继承来实现适配器功能。只能访问A接口,但想要调用B中的方法b,可以写适配器类P实现A接口,并继承B接口的实现类,这样就可以调用P中的方法b。
<span style="color:red;"> 对象适配器模式:</span>与上述类似,但只需实现A接口,并创建一个B的实现类的实例为成员变量bInstance,即可在a()中调用bInstance.b()。
<span style="color:red;"> 接口适配器模式:</span>已有一个包含很多方法的接口,创建一个实现该接口的实现类P,以置空的方式实现所有方法,我们需要哪些方法就直接继承P并重写对应的方法,而不需要重写所有的方法。
- 使用场景
- 系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码
- 创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作
<span style="color:#00FF7F;"> 优点:</span>将目标类和适配者类解耦,灵活性和扩展性都非常好,完全复合开闭原则。
<span style="color:#00FF7F;"> 缺点:</span>一次最多只能适配一个适配者类,不能同时适配多个适配者。
[**点击查看别人总结spring中各种模式**](https://blog.csdn.net/caoxiaohong1005/article/details/80039656)
##工厂方法
方式:实现FactoryBean接口。
原理:
实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个bean.getOjbect()方法的返回值。
public SqlSessionFactory getObject() throws Exception {
if (this.sqlSessionFactory == null) {
afterPropertiesSet();
}
return this.sqlSessionFactory;
//返回的不是 SqlSessionFactoryBean 的实例,而是 SqlSessionFactoryBean.getObject() 的返回值
}
[SqlSessionFactoryBean解析](https://www.cnblogs.com/wade-luffy/p/6093355.html)
##适配器模式
方式:SpringMVC中的适配器HandlerAdatper。
原理:HandlerAdatper根据Handler规则执行不同的Handler。
过程:
DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求,处理Handler。HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。
实现意义:
HandlerAdatper使得Handler的扩展变得容易,只需要增加一个新的Handler和一个对应的HandlerAdapter即可。因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行相应的方法。这样在扩展Controller时,只需要增加一个适配器类就完成了SpringMVC的扩展了。
- 不同类型的Handle
- 继承Controller方式所使用的适配器:SimpleControllerHandlerAdapter
- HTTP请求处理器适配器:HttpRequestHandlerAdapter
- 注解方式(@Controller)的处理器适配器:RequestMappingHandlerAdapter
[springmvc适配器模式](https://blog.csdn.net/a362212624/article/details/80431499)
spring中设计模式的更多相关文章
- java中的23中设计模式(转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)
Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...
- java开发中的23中设计模式详解--大话设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java中的23中设计模式(转载的,有时间一定要熟读)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java23中设计模式
原文来自:http://zz563143188.iteye.com/blog/1847029 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design patt ...
- java开发中的23中设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java23中设计模式详解
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java开发的23中设计模式
本文转自 Java开发中的23种设计模式详解(转) 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓 ...
- Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- 原生js实现数据单向绑定
Object.defineProperty()方法直接在对象上定义一个新属性,或修改对象上的现有属性,并返回该对象. Object.defineProperty(obj, prop, descript ...
- 【20190415】JavaScript-事件流与stopPropagation()、stopImmediatePropagation()的误区解析
这两天仔细看了一下MDN上关于事件流机制和相关方法的文档,发现有个很大的误区.过去我一直以为stopPropagation()就是用来阻止事件冒泡的,甚至很多博客和菜鸟教程上都是这样写的.但实际上文档 ...
- 算法题丨Remove Duplicates from Sorted Array
描述 Given a sorted array, remove the duplicates in-place such that each element appear only once and ...
- Arcgis for Javascript 对接iServer发布的Mapserver服务
测试说明 webgis开发流程一般是: 数据处理 ---发布服务---SDK开发.除了开源的服务以外,一般各GIS厂商都是自己的服务自己的SDK才能对接. SuperMap iServer 提供了将 ...
- 阿里云服务器部署Office online注意事项
阿里云服务器部署Office online注意事项 一.参考配置 实例规格:4核8GB(IO优化) 网络带宽:5Mbps 系统盘:40G 存储盘:200G OS:Windows Server 2016 ...
- iOS----------UITextField实现过滤选中状态拼音
2018年上班的第二天,就这样背了一个大锅.我们项目中有一个搜索功能,在这一期的版本中,为了增强优化,去除了过滤空格的请求,这样或许能增加很好的用户体验,恰恰相反,偷鸡不成蚀把米.没想到苹果系统的输入 ...
- ASP.NET Zero--前期要求
前期要求 需要以下工具才能使用ASP.NET Zero Core解决方案: Visual Studio 2017 + Visual Studio扩展: Bundler&Minifier Web ...
- 数据库之redis篇(2)—— redis配置文件,常用命令,性能测试工具
redis配置 如果你是找网上的其他教程来完成以上操作的话,相信你见过有的启动命令是这样的: 启动命令带了这个参数:redis.windows.conf,由于我测试环境是windows平台,所以是这个 ...
- linux内核IDR机制详解【转】
这几天在看Linux内核的IPC命名空间时候看到关于IDR的一些管理性质的东西,刚开始看有些迷茫,深入看下去豁然开朗的感觉,把一些心得输出共勉. 我们来看一下什么是IDR?IDR的作用是什么呢? 先来 ...
- 实验吧逆向catalyst-system Writeup
下载之后查看知道为ELF文件,linux中执行之后发现很慢: 拖入ida中查看发现有循环调用 sleep 函数: 这是已经改过了,edit -> patch program -> chan ...