设计模式为我们设计软件、编写代码提供了理论依据,可以帮助我们提升代码的可读性、可扩展性,降低维护成本,解决复杂的业务问题。
学习设计模式需要联系生活,联系场景。下面我们结合生活中的场景使用简短的语言总结一下各个设计模式的特点。
序号 | 设计模式 | 总结 | 目的 | 生活中的场景 | 源码中的应用 |
1 | 工厂模式 | 产品标准化、生产更高效 | 封装创建细节 | 富士康代工厂 | LoggerFactory、Calendar |
2 | 单例模式 | 一个类仅有一个实例,并且提供一个全局访问点 | 保证全局唯一 | 公司CEO | BeanFactory、Runtime |
3 | 原型模式 | 通过拷贝原型创建新的对象,分身术 | 高效创建对象 | 克隆羊 | ArrayList、PrototypeBean |
4 | 建造者模式 | 用来创建复杂的复合对象,低配中配高配自己决定 | 开放个性配置步骤 | 装配电脑 | StringBuilder、BeanDefinitionBuilder |
5 | 代理模式 | 为其他对象提供一种代理以控制对这个对象的访问 | 增强职责 | 代理律师 | ProxyFactoryBean、JdkDynamicAopProxy、CglibAopProxy |
6 | 门面模式 | 对外提供统一出口 | 统一访问入口 | 公司前台 | JdbcUtils、RequestFacade |
7 | 装饰器模式 | 为对象添加新功能 | 灵活扩展、同宗同源 | 煎饼加鸡蛋 | InputStream、BufferedReader |
8 | 适配器模式 | 接口转换,将原来不兼容的两个类融合在一起 | 兼容转换 | 电源适配器 | AdvisorAdapter、HandlerAdapter |
9 | 桥接模式 | 将两个能够独立变化的部分分离开来、约定优于配置 | 不允许用继承 | 珠港澳大桥 | DriverManager |
10 | 享元模式 | 使用对象池来减少重复对象的创建,优化资源配置,减少重复浪费 | 共享资源池 | 全国社保联网 | String、Integer、ObjectPool |
11 | 组合模式 | 将整体与局部进行递归组合,让客户端能够以一种的方式对其进行处理 | 统一整体和个体 | 组织架构树 | HashMap、SqlNode |
12 | 委派模式 | 允许对象组合实现与继承相同的代码重用,负责任务的调用和分配,这个需求很简单,怎么实现我不管 | 只对结果负责 | 授权委托书 | ClassLoader |
13 | 模板方法模式 | 先定框架,再补充细节,流程标准化,细节可微调 | 逻辑复用 | 把大象装冰箱 | JdbcTemplate |
14 | 策略模式 | 封装不同的算法,用户自己选择算法 | 把选择权交给用户 | 选择支付方式 | Comparator |
15 | 责任链模式 | 拦截的类都实现统一接口,每个接收者都包含对下一个接收者的引用。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。学生发作业本、不是自己的就往后传。 | 解耦处理逻辑 | 踢皮球 | FilterChain、Pipeline |
16 | 命令模式 | 将请求封装成命令,并记录下来,能够撤销与重做,运筹帷幄之中,决胜千里之外 | 解耦请求和处理 | 电视遥控器 | Runnable、TestCase |
17 | 状态模式 | 根据不同的状态做出不同的行为、状态驱动行为,行为决定状态 | 绑定状态和行为 | 订单状态跟踪 | LifeCycle |
18 | 观察者模式 | 状态发生改变时通知观察者,到点就通知我 | 解耦观察者与被观察者 | 学校打铃 | ContextLoaderListener |
19 | 中介模式 | 将对象之间的通信关联关系封装到一个中介类中单独处理,从而使其耦合松散,联系方式我给你,其他自己搞定 | 统一管理网状资源 | 微信朋友圈 | Timer |
20 | 迭代器模式 | 提供一种方法顺序访问一个聚合对象中的各个元素 | 统一对集合的访问方式 | 进站检票 | Iterator |
21 | 访问者模式 | 稳定数据结构,定义新的操作行为,横看成岭侧成峰,远近高低各不同 | 解耦数据结构和数据操作 | KPI考核 | FileVisitor |
22 | 备忘录模式 | 保存对象的状态,在需要时进行恢复 | 备份、后悔机制 | 草稿箱 | StateManageableMessageContext |
23 | 解释器模式 | 给定一个语言,定义它的语法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。我想说鸟语,一切解释权都归我 | 实现特定语法解析 | 摩斯密码 | Pattern、ExpressionParser |