设计模式

各大设计模式

单例模式

参考

  • 只有一个实例
  • 构造器私有,外部类无法通过调用构造器方法创建该实例
  • 没有公开的 set 方法
  • 提供一个公开的 get 方法获取唯一的这个实例

a、饿汉式

提前把对象 new 出来了,即第一次获取之前就已经存在这个实例了(static)

即提前加载

b、懒汉式

第一次获取的时候发现空,就创建实例,再赋值(static)

(线程不安全)

写法:(加锁、双检锁、volatile、静态内部类、枚举

工厂模式

参考

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工程模式

a、简单工厂模式

使用静态工厂,但使用反射会影响性能,为了避免反射,可以用 Map 存每种类的实例

b、工厂方法模式

工厂类直接被抽象化,需要具体特定化的逻辑代码转移到实现抽象方法的子类中

c、抽象工程模式

工厂方法类中只有一个抽象方法,要想实现多种不同的类对象,只能去创建不同的具体工厂方法的子类来实列化,而抽象工厂则是让一个工厂负责创建多个不同类型的对象

建造者模式

参考

抽象建造者类、具体建造者类继承抽象类、director 指导类

原型模式

参考

克隆对象(Cloneable)

比起new的好处是保留对象的信息

注意:浅拷贝和深拷贝

浅拷贝就是基本的数据类型直接复制,而成员变量里引用的其他对象,还是那个

深拷贝就是所有都会复制一遍(可以通过递归实现,或者通过序列化把对象写入流中再从流中取出来)

或者使用工具类:

  • 深拷贝(deep copy):SerializationUtils
  • 浅拷贝(shallow copy):BeanUtils

责任链模式

参考

将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

关键词:handler 抽象类、handler 实现类、handleRequest 方法

就是 handler 里面有 handler 成员变量,存着下一个 handler(实现也可以不是传递的方式,看参考文章)

应用:

  • SpringMVC 中的 ServletFilter
  • Spring 中的 SpringInterceptor
  • dubbo

观察者模式

参考

如 RocketMQ 的发布/订阅模式

当一个对象的状态发生改变时,已经登记的其他对象能够观察到这一改变从而作出自己相对应的改变。通过这种方式来达到减少依赖关系,解耦合的作用。

关键词:主题(Subject)、主题实现类、观察者

应用:

  • Observable 类
  • Spring 的 ApplicationListener
    • ApplicationEventMulticaster 作为主题,里面有添加,删除,通知等

策略模式

参考

关键词:Strategy(抽象策略)、ConcreteStrategy 策略实现、Context

可以搞一个抽象类(游泳)和实现类,然后 Context 里面维护一个 Map,Context get 了一个游泳(自由泳,其他也可以),get 里面发现 Map 没有,就 new 存入 Map,有就直接返回

也可以直接 new 一个返回

应用:

  • ThreadPoolExecutor(HashSet)