设计模式来源于生活,是一门艺术;合理地使用设计模式可以提升代码的可读性、可扩展性,降低维护成本,解决复杂的业务问题等。
GOF 23种设计模式
分类 | 设计模式 |
---|---|
创建型 | 工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式 |
结构型 | 适配器模式、桥接模式、组合模式、装饰器模式、门面模式、享元模式、代理模式 |
行为型 | 解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、调解者模式、 备忘录模式、观察者模式、状态模式、策略模式、访问者模式 |
关系图如下:
各设计模式之间的对比
单例 vs 工厂
- 工厂类一般被设计为单例,例如,ApplicationContext
策略 vs 工厂
- 工厂模式包含工厂方法、抽象工厂,属于创建型模式(new);策略模式属于行为型模式(invoke)
- 工厂模式的主要目的是封装好创建逻辑;策略模式接收工厂创建好的对象,从而实现不同的行为
策略 vs 委派
- 策略模式是委派模式内部的一种实现形式,策略模式关注的是结果能否相互替代
- 委派模式更关注分发和调度的过程
模板 vs 工厂方法
- 工厂方法是模板方法的一种特殊实现
模板 vs 策略
- 模板和策略都有封装算法
- 策略模式是使不同算法可以相互替换,且不影响客户端使用
- 模板方法是针对定义好的一个算法流程,将有细微差异的部分交给子类实现;策略模式的算法实现是封闭的
- 模板模式不能改变算法流程,策略模式可以改变算法流程且可替换
装饰者 vs 静态代理
- 装饰者模式关注点在于给对象动态扩展、添加方法;代理更加注重控制对对象的访问
- 装饰者模式通常把被装饰者作为构造参数;代理模式通常会在代理类中创建被代理对象的实例
装饰者 vs 适配器
- 二者都属于包装器模式
- 装饰者可以实现与被装饰者相同的接口或者继承被装饰者作为它的子类;适配器和被适配者可以实现不同的接口
适配器 vs 静态代理
- 适配器可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式
适配器 vs 策略
- 在适配业务复杂的情况下,利用策略模式优化动态适配逻辑
Spring中常用的设计模式
设计模式 | 一句话总结 | Spring实例 |
---|---|---|
工厂模式 | 只对结果负责,封装创建过程 | BeanFactory、Calendar |
单例模式 | 保证独一无二 | ApplicationContext、Calendar |
原型模式 | 拔一根猴毛,吹出千万个 | ArrayList、PrototypeBean |
代理模式 | 找人办事,增强职责 | ProxyFactoryBean、JdkDynamicAopProxy、 CglibAopProxy |
委派模式 | 干活算你的(普通员工), 功劳 算我的(项目经理) |
DispatcherServlet、 BeanDefinitionParserDelegate |
策略模式 | 用户选择,结果唯一 | InstantiationStrategy |
模板模式 | 流程标准化,自己实现定制 | JdbcTemplate、HttpServlet |
适配器模式 | 兼容转换头 | AdvisorAdapter、HandlerAdapter |
装饰器模式 | 包装,同宗同源 | BufferedReader、InputStream、 OutputStream、 HttpHeadResponseDecorator |
观察者模式 | 任务完成时通知 | ContextLoaderListener |