Spring中常见的设计模式

1、Java设计模式

  • 设计模式(Design Pattern)是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。

  • 早在1995 年,GOF合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,人称「GoF设计模式」。

  • 这 23 种设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联关系和组合关系的充分理解。

  • 当然,软件设计模式只是一个引导,在实际的软件开发中,必须根据具体的需求来选择:

    • 对于简单的程序,可能写一个简单的算法要比引入某种设计模式更加容易;
    • 但是对于大型项目开发或者框架设计,用设计模式来组织代码显然更好。

2、设计模式分类

1. 根据目的来分

根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。

  • 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。
  • 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。
  • 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。

2. 根据作用范围来分

根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式

两种。

  • 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。
  • 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。

2、GoF的23种设计模式的功能

  1. 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
  2. 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。
  3. 工厂方法(Factory Method)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。
  4. 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。
  5. 建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。
  6. 代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
  7. 适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
  8. 桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
  9. 装饰(Decorator)模式:动态的给对象增加一些职责,即增加其额外的功能。
  10. 外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
  11. 享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。
  12. 组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。
  13. 模板方法(TemplateMethod)模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
  14. 策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
  15. 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
  16. 职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
  17. 状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力。
  18. 观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
  19. 中介者(Mediator)模式:定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
  20. 迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
  21. 访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
  22. 备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
  23. 解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。

3、Spring设计模式

  • Design Patterns(设计模式) 表示面向对象软件开发中最好的计算机编程实践。 Spring 框架中广泛使用了不同类型的设计模式。

3.1 Spring 中常见的设计模式

  • 工厂模式 : BeanFactory
  • 装饰器模式: BeanWrapper
  • 代理模式: AopProxy
  • 单例模式: ApplicationContext
  • 委派模式: DispatcherServlet
  • 策略模式: HandlerMapping
  • 适配器模式: HandlerApdapter
  • 模板方法模式: JdbcTemplate
  • 观察者模式: ContextLoaderListener

3.2 Spring 的四大模块及典型的设计模式

  • Spring IOC :工厂模式、单例模式、装饰器模式
  • Spring AOP :代理模式、观察者模式
  • Spring MVC :委派模式、适配者模式
  • Spring JDBC : 模板方法模式

3.3 Spring 中常见的设计模式分类

类型 名称 英文
创建新模式 工厂模式 Factory Pattern
创建新模式 单例模式 Singleton Pattern
创建新模式 原型模式 Prototype Pattren
结构型模式 适配器模式 Adapter Pattren
结构型模式 装饰器模式 Decorator Pattren
结构型模式 代理模式 Proxy Pattren
行为性模式 策略模式 Strategy Pattren
行为性模式 模板模式 Template Pattren
行为性模式 委派模式 Delegate Pattren
行为性模式 观察者模式 Observer Pattren

4、Spring中的单例模式详解

4.1 单例模式

  • 某些类(应用、单元)只能创建一个实例,则是单例模式

4.2 单例模式的定义和特点

定义:

  • 一个类只有一个实例,且改类能自行创建这个实例的一种模式。

    • 在计算机系统中,Windows的回收站、操作系统的文件系统、多线程中的线程池、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。

4.2 单例模式的特点

  1. 只能有一个实例
  2. 该单例对象必须由单例类自行创建
  3. 单例类对外提供一个访问改单例的全局访问点

4.3 单例模式的优点和缺点

优点:

  • 单例模式可以保证内存中只有一个实例,减少了内存的开销
  • 可以避免对资源的多重占用
  • 单例模式设置了全局访问点,可以优化和共享资源的访问

缺点:

  • 单例模式一般没有接口,扩展困难,如果扩展就需要修改原来的代码,没有第二种途径,违背开闭原则
  • 在并发测试中,单例模式不利于代码调式,在调试过程中如果单例中的代码没有执行完,则也不能进行模拟生成一个新的对象
  • 单例模式的功能代码通常写在一个类中,如果功能设计不合理,则就会容易违背单一职责的原则。

4.4 单例模式的实现方式

  • 方式一:懒汉式单例

    • 特点:在类加载的时候没有生成单例,只有当第一次调用 getInstance 方法时才去创建这个单例

      • 如果编写的是多线程程序,则不要删除上例代码中的关键字 volatile 和 synchronized,否则将存在线程非安全的问题。如果不删除这两个关键字就能保证线程安全,但是每次访问时都要同步,会影响性能,且消耗更多的资源,这是懒汉式单例的缺点。
  • 方式二:饿汉式单例
    • 特点:类一加载就会创建一个单例,在保证调用 getInstance 方法之前单例就已经存在

      • 饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题

资料引用:

  • http://c.biancheng.net/design_pattern
  • http://c.biancheng.net/view/1320.html
  • https://www.cnblogs.com/bert227/p/10902357.html
  • http://c.biancheng.net/view/1338.html

Spring中常见的设计模式相关推荐

  1. Spring中涉及的设计模式总结

    Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式:BeanFactory. Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获 ...

  2. Spring中的部分设计模式

    目录: 目录 设计模式在应用中遵循六大原则: a.开闭原则 b.里氏代换原则 c.依赖倒转原则 d.接口隔离原则 e.迪米特法则(最少知道原则) f.合成复用原则 设计模式之间的关系图 1.工厂模式( ...

  3. Spring中常见的注解收集

    Spring中常见的注解收集 文章目录 Spring中常见的注解收集 1.@ResponseBody 2.@RequestBody 3.@RequestParam 4.@Controller 5.@R ...

  4. 学习笔记【Spring中常用的设计模式】

    文章目录 简介 一. Spring用到的设计模式类别 1. 创建型模式 2. 结构性模式 3. 行为型模式 二. 设计模式详解 1. 工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 1.3 抽象 ...

  5. Spring中如何使用设计模式

    2019独角兽企业重金招聘Python工程师标准>>> 关于设计模式,如果使用得当,将会使我们的代码更加简洁,并且更具扩展性.本文主要讲解Spring中如何使用策略模式,工厂方法模式 ...

  6. php mysql设计中常问_PHP开发中常见的设计模式

    一.工厂模式 工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式. 使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实 ...

  7. Spring中的若干设计模式

    Spring不是无端开发出来的,开发Spring的时候用到了一大堆设计模式.或者说Spring是一个通用的组件而非业务组件,要适应各种业务场景,所以必然是抽象的也是处处体现其设计的. 代理模式: 代理 ...

  8. java中常见的设计模式有那些?

    Java有23 种设计模式, 分三大类: 我们初级程序员常见的有: 单例模式 简单工厂模式 代理模式(Proxy) 策略模式(Strategy) 策略模式(Strategy) 适配器模式 单例模式 特 ...

  9. Android开发中常见的设计模式

    对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次.而在android开发中,必要的了解一些设计模式又是非常有必要的.对于想系统的学习设计模式的 ...

最新文章

  1. 汇编语言中将数据、代码、栈放入不同的段
  2. IsNull和IsEmpty的区别
  3. 通风与防排烟工程电子书_暖通、通风、防排烟风管如何做抗震设计呢?
  4. Linux系统中FTP的配置(图文详解-全)
  5. Ubuntu安装google拼音输入法
  6. 第10章:Shell基础
  7. (译)在Objective-c里面使用property教程
  8. Windows XP时代终结:假设你还在用它怎么办
  9. C#代码:获取与指定颜色相似的.NET自带颜色
  10. 【IT笔试面试题整理】丑数
  11. ansys matlab 调用,matlab 调用ansys (转载)
  12. 用Python看蜜雪冰城店铺在哪个省份最多~
  13. 总结Android各类常用三方框架
  14. 《SEM长尾搜索营销策略解密》一一2.1 起因:核心词成本过高
  15. 相比于深度学习,传统的机器学习算法难道就此没落了吗,还有必要去学习吗?
  16. C# 复制Word(复制全部内容、部分内容、页眉页脚)
  17. 苹果修复用户位置有关的安全漏洞,苹果Find My帮你防丢
  18. 利用tensorflow训练自己的图片数据(1)——预处理
  19. 机器学习 部署 嵌入式_如何在移动和嵌入式设备上部署机器学习模型
  20. WordPress资源站付费下载Blackcat主题

热门文章

  1. mysql高可用面试题_MySQL - MySQL面试题
  2. 耶鲁大学开放课程:《聆听音乐》1
  3. 好的学习习惯-阅读方法有哪些?
  4. 数据挖掘xgb使用总结
  5. 3. 全向相机模型Omnidirectional Camera Model
  6. java phrase_18.match_phrase的用法
  7. Python使用Excel表格的学生成绩管理系统
  8. SQL查询出距当前时间最近的一条或多条记录。
  9. Python2和Python3的区别,为什么大家都要选Python3的原因
  10. django之路由(url)