• 创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)、原型模式(ProtoType)
  • 结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验,常见的结构型模式,包括桥接模式(Bridge)、适配器模式(Adapter)、装饰者模式(Decorator)、代理模式(Proxy)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)等
  • 行为型模式,是从类或对象之间交互、职责划分等角度总结的模式,比较常见的行为型模式有策略模式(Strategy)、解释器模式(Interpreter)、命令模式(Command)、观察者模式(Observer)、迭代器模式(Iterator)、模板方法模式(Template Method)、访问者模式(Visitor)

单例模式(Singleton)

目的:保证在整个应用中某一个类有且只有一个实例,而且自行实例化并向整个系统提供这个实例

  • 如果工具方法全部使用 static 修饰,说明工具方法只需要使用工具类名调用即可,此时必须把工具类的构造器私有化
  • 在类装载的时候就创建对象实例
  • 使用场景:java.lang.Runtime
  • 每次获取实例都会进行判断,看是否需要创建实例
  • “双重检查加锁”机制:不是每次进入 getInstance() 方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块,这是第一重检查,进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。
  • 定义一个包含单个元素的枚举类型

模板方法模式(Template Method)

  • 在采用某个算法的框架,需要对它的某些部分进行改进
  • 抽象父类的一个方法中定义该方法的总体算法的骨架(模板方法),而把其中某些具体的步骤(不能实现的部分)抽象成抽象方法,延迟到子类中去实现

    • 模板方法:一种通用的处理方式,即模板(总体算法的骨架)
    • 抽象方法:一种具体的业务功能实现,由子类完成

使用场景:JDBCTemplate、JUC中的 AQS

装饰器模式(Decorator Pattern)

  • 在不必改变源代码基础上,动态地扩展一个对象的功能
  • 通过创建一个包装对象,包裹真实的对象
  • 使用场景:IO 流中的包装流、Servlet 中的敏感字过滤
  • 特点:
    • 装饰对象和真实对象有相同的接口
    • 装饰对象包含一个真实对象的引用(多用组合,少用继承)
    • 装饰对象可以在转发这些请求以前或以后增加一些附加功能

适配器模式(Adapter Pattern)

  • 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

代理模式(Proxy Pattern)

  • 客户端不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象

策略模式(Strategy Pattern)

  • 策略模式代表了解决一类算法的通用解决方案,需要在运行时选择使用哪种方案
  • 定义一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换,让算法独立于使用它的客户而独立变化
  • 策略模式包含三部分内容
    • 一个代表某个算法的接口(它是策略模式的接口)
    • 一个或多个该接口的具体实现,它们代表了算法的多种实现
    • 一个或多个使用策略对象的客户

观察者模式

  • 某些事件发生时(比如状态转变),一个对象(主题)需要自动地通知其他多个对象(观察者)

责任链模式

  • 一种创建处理对象序列(比如操作序列)的通用方案:一个处理对象可能需要在完成一些工作之后,将结果传递给另一个对象,这个对象接着做一些工作,再转交给下一个处理对象,以此类推

工厂模式

  • 无需向客户暴露实例化的逻辑就能完成对象的创建
  • Spring 中:BeanFactory 和 ApplicationContext

迭代器模式

  • 提供一个一致的方法来顺序访问集合中的对象,这个方法与底层的集合的具体实现无关
  • JDK 中:java.util.Iterator、java.util.Enumeration

享元模式

  • 使用缓存来加速大量小对象的访问时间
  • JDK 中:java.lang.Integer#valueOf(int)、java.lang.Boolean#valueOf(boolean)、java.lang.Byte#valueOf(byte)、java.lang.Character#valueOf(char)