常用设计模式

date
Dec 7, 2020
slug
常用设计模式
status
Published
tags
开发相关
Java
summary
type
Post

创建型模式

工厂方法

工厂和产品都定义接口,产品接口对应不同的产品,工厂接口对应生产不同产品的工厂,最终由创造者来决定使用什么工厂生产什么产品。对于什么工厂生产什么产品都是不确定的
notion image

抽象工厂

抽象工厂在工厂模式下对产品进行了细分,工厂知道什么什么产品,但是产品的分类不确定。对于产品A,例如:沙发,工厂1生产木质沙发,工厂2生产皮质沙发,抽象工厂知道自己要生产沙发,但是要生产什么类型的沙发是不确定;木质沙发、皮质沙发对应沙发接口。
notion image

生成器模式

生成器模式往往应对一个有太多参数需要设置的大类,太多放在构造函数中初始化会另构造函数参数过长造成坏味道。生成器(Builder)明确知道有哪些参数需要设置,至于设置成什么样的参数下放到实现类或子类中去,不同的子类生成不同对象。到目前为止生成器模式跟模板方法很相似
生成器的主管类不是必须的,也是与模板方法的重要差别,主管类可以调整生成器内各个不走的顺序和参数,适合应对不同的制作参数。
notion image

单例模式

这个就不多讲了
notion image

结构型模式

适配器模式

适配器模式主要用来将一个对象封装成另一种对象供原有的方法使用,主要应对场景是不好修改原有的代码。可以类比插头转换器,就是将类或对象转化成兼容原有方法的类和对象。这里有两种,一种是对象适配器,一种是类适配器。
notion image
 
 
notion image
Executors.callable(Runnable task, T result) 方法就是通过RunnableAdapter 适配器把Runable类转为Callable。

装饰器模式

装饰器模式跟代理模式有点类似,代理模式是方法的前后增强,装饰器大多是是对方法输入输出参数进行前置指正,而且装饰器可以不断套其他装饰器,装饰器基于装饰器接口实现。
经典案例:Java的IO相关类。
notion image

代理模式

代理模式着重于对源对象方法的前后增强,由于实现与源对象相同的接口,可直接赋值给源对象类引用。
经典案例:JDK的动态代理,InvocationHandler接口。
notion image
适配器模式能为被封装对象提供不同的接口, 代理模式能为对象提供相同的接口, 装饰模式则能为对象提供加强的接口。

行为型模式

观察者模式

具体观察者实现观察者接口,发布者通过订阅接口添加观察者,发布者通过发布接口遍历执行观察者的更新接口。
经典案例:Spring框架里面的监听器,Spring初始化的时候将实现了ApplicationListener接口的监听器注册进AbstractApplicationContext抽象类里面的ApplicationEventMulticaster变量,再通过multicastEvent(ApplicationEvent event)方法执行监听器里面的方法。
notion image

策略模式

策略模式对特定策略方法的进行抽象,上下文只负责执行策略方法,至于策略方法不同实现类有不同的实现,客户端来控制具体使用什么策略。
经典案例:Comparator、Comparable的compare方法实现,Collection.Sort()对实现了Comparable方法类的排序。
notion image

模板方法模式

模板抽象类已经规定了既定的方法和响应方法的调用步骤,至于方法内部实现交由给子类实现。
经典案例:Spring的容器初始化AbstractApplicationContext,AbstractApplicationContext的refresh()方法里面定义了Spring容器初始化的需要执行的一些方法顺序,每个步骤对应预先定义的抽象方法,至于每个步骤方法的实现不同的ApplicationContext有不同的实现,像它的子类ClasspathXmlApplicationContext,FileSystemXmlApplicationContext,AnnotationConfigApplicationContext对refresh()方法的实现都不一样,毕竟他们bean定义的方法都不一样。
notion image

迭代器模式

主要作用是不暴露内部集合的情况下安全的遍历内部集合元素。
经典案例:Iterator,Iterable接口的相关实现。
notion image

命令模式

 
经典案例:Runnable接口的实现
notion image

© Ryan Tang 2021 - 2025