常用设计模式


设计模式分类

设计模式可分为三类共23种:

  • 创建型:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
  • 结构型:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

常用设计模式

单例模式

单例模式常见的三种实现方式

  • 静态初始化(饿汉式):在类初始化时完成单例实例的创建,因此不会产生并发问题,这种方式下不管是否会使用到这个单例,都会创建这个单例。
  • 双重检查(懒汉式):在使用到这个单例实例的时候才会去创建,如果没有使用就不会创建。这个方式必然会面对多个线程同时使用实例时的并发问题。可以通过synchronized或者lock进行双重检查,保证只有一个线程能够创建实例(注意内存可见性引起的并发问题,必须使用volatile关键字修饰单例变量)。
  • 单例注册表:使用Spring中Bean的单例模式创建。

工厂模式

工厂模式是创建不同类型实例时常用的设计模式,在创建实例对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来只想新创建的对象;例如Spring中各种Bean是由不同Bean工厂类进行创建的。

代理模式

主要用在不适合或者不能直接引用另一个对象的场景,可以通过代理模式对被代理对象的访问行为进行控制。Java中代理模式又分为静态代理和动态代理。

  • 静态代理:指在编译时就已经创建好了代理类;
  • 动态代理:指在JVM运行过程中动态创建的代理类。

责任链模式

责任链模式为请求创建了一个接收者对象的链,通常每个接收者都包含对另一个接收者的引用,如果当前接收者不能处理该请求,那么它会把相同的请求传递给下一个接收者;例如:Spring Security通过责任链模式完成请求的认证。

适配器模式

适配器模式可以把两种不匹配的对象进行适配,也可以起到对两个不同的对象进行解耦的作用。例如常用的日志处理框架SLF4J,如果使用了SLF4J就可以跟Log4j或者Logback等具体的日志实现框架进行解耦。通过不同适配器将SLF4J与Log4j等实现框架进行适配,完成日志功能。

观察者模式

观察者模式也被称为发布订阅模式,适用于一个对象的某个行为需要触发一系列事件的场景,例如gRPC中的Stream流式请求的处理就是通过观察者模式实现的。

构造者模式

构造者模式使用多个简单的对象一步一步构建一个复杂的对象。例如Java中StringBuilder。