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中设计模式的更多相关文章

  1. java中的23中设计模式(转)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  2. Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)

    Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...

  3. java开发中的23中设计模式详解--大话设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  4. java中的23中设计模式(转载的,有时间一定要熟读)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  5. java23中设计模式

    原文来自:http://zz563143188.iteye.com/blog/1847029 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design patt ...

  6. java开发中的23中设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  7. java23中设计模式详解

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  8. java开发的23中设计模式

    本文转自  Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓 ...

  9. Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. css direction 属性简介与实际应用。

    目前正在用vue构建组件库.写到弹框的时候没想到按钮的顺序问题,但是在应用中,确实会有选项按钮顺序不同的情况发生,但是又想共用一个组件.那么问题就出现了.后来看到了这篇文章,才茅塞顿开. direct ...

  2. python数据处理excel和pdf,并打包成exe

    之前零散的用过一点python做数据处理,这次又遇到一个数据处理的小功能,因此,记录一下整个流程,方便以后查阅. 功能要求:读取excel,找指定的PDF文件的页数是否与excel中记录的一致 整个处 ...

  3. zabbix server3.4 使用mailx配置邮件报警

    软件具体配置如下: 操作系统:Centos7.5 zabbix server版本:zabbix server3.4 zabbix agent版本:zabbix agent3.0 现在开始配置zabbi ...

  4. iOS----------关于Cornerstone的偏好设置

    应用场景:有时候我们的项目会导入一些第三方.a文件,但是当我们在svn上check out下来的时候,会发现少了一些.a文件.于是乎项目就报错了. 针对这种情况,我们应该怎么办呢? 1.先打开Corn ...

  5. 9102 IT人保持记忆力及健康的方法

    做技术时间久了,我们会发现有的时候我们会感觉记忆力衰减太快,前脚刚忙完的事或者刚做完计划任务没多久就遗忘了,或者是以前轻车熟入的方法死活都记不起来了,亦或者之前学习一门技术很快就掌握真谛,现在即便花N ...

  6. PHP面向对象的小总结

     面向对象特性: *重用性 (每个模块都可以在项目中重复使用) *灵活性 (每个模块都很轻松被替换更改的) *拓展性(在模块上添加新功能是很方便的) 类和对象的关系(类生成对象) 物以类聚:相同特性的 ...

  7. python正则表达式相关记录

    1 python中字符串前加‘r’,即可阻止‘\’导致的字符转义.但是在re.sub()中参数中加'r'不会起作用.

  8. Django REST framework基础:序列化

    表结构: class Article(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(m ...

  9. 【Linux基础】判断当前机器是虚拟机还是物理机

    1.使用dmidecode命令查看(root权限) DMI (Desktop Management Interface, DMI)的主要组成部分是Management InformationForma ...

  10. echarts堆叠图添加总量

    echarts在使用中往往会遇到需要展示总量信息的情况,比较典型的就是3维统计的堆叠柱状图 堆叠是在柱状图的基础上,给几项设置同一stack来实现的.不考虑在tips中实现总和,有两种方式可以实现总和 ...