各设计模式的总结和对比
一句话归纳设计原则
设计原则 | 一句话归纳 | 目的 |
---|---|---|
开闭原则(OCP)Open-Close | 对扩展开发,对修改关闭 | 减少维护带来新的风险 |
依赖倒置原则(DIP)Dependence Inversion | 高层不依赖低层 | 更利于代码结构的升级、扩展 |
单一职责原则(SRP)Simple Responsibility | 一个类只干一件事 | 便于理解,提高代码可读性 |
接口隔离原则(ISP)Interface Segregation | 一个接口只干一件事 | 功能解耦,高聚合,低耦合 |
迪米特法则(LoD)Law of Demeter | 不该知道的不要知道 | 只和朋友交流,不和陌生人说话,减少代码臃肿 |
里氏替换原则(LSP)Liskov Substitution | 子类重写方法功能发生改变,不应该影响父类方法 | 防止继承泛滥 |
合成复用原则(CARP)Composite/Aggregate Reuse | 尽量使用组合实现代码复用,而不使用继承 | 降低代码耦合 |
设计模式使用频次总结
创建型模式(Creational)
高频:工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、单例模式(Singleton)、建造者模式(Builder)
低频:原型模式
结构型模式(Structural)
高频:代理模式(Proxy)、门面模式(Facade)、装饰器模式(Decorator)、享元模式(Flyweight)、适配器模式(Adapter)、组合模式(Composite)
低频:桥接模式(Bridge)
行为型模式(Behavioral)
高频:模板方法模式(Template Method)、策略模式(Strategy)、责任链模式(Chain of Responsibility)、状态模式(State)
低频:备忘录模式(Memento)、观察者模式(Observer)、迭代器模式(Iterator)、中介者模式(Mediator)、命令模式(Command)、解释器模式(Interpreter)、访问者模式(Visitor)
一句话归纳设计模式
设计模式 | 一句话总结 | 目的 | 生活案例 | 框架源码举例 |
---|---|---|---|---|
工厂模式(Factory) | 产品标准化,生产更高效 | 封装创建细节 | 实体工厂 | LoggerFactory、Calender |
单例模式(Singleton) | 世界上只有一个自己 | 保证独一无二 | CEO | BeanFactory、Runtime |
原型模式(Prototype) | 拔出一根猴毛,吹出千万个 | 高效创建对象 | 克隆 | ArrayList、PrototypeBean |
建造者模式(Builder) | 各种方式进行适配 | 开放个性配置步骤 | 选配 | StringBuilder、BeanDefinitionBuilder |
代理模式(Proxy) | 没有资源没时间,需要找人来帮忙 | 增强职责 | 红娘 | ProxyFactoryBean、JdkDynamicAopProxy、CglibAopProxy |
门面模式(Facade) | 打开一扇门,走向全世界 | 统一访问入口 | 前台 | JdbcUtils、RequestFacade |
装饰器模式(Decorator) | 他大爷、他二爷,都是他爷 | 扩展灵活,同宗同源 | 煎饼 | BufferedReader、InputStream |
享元模式(Flyweight) | 优化资源配置,减少重复浪费 | 共享资源池 | 全国社保联网 | String、Integer、ObjectPool |
组合模式(Composite) | 人在一起叫团伙,心在一起叫团队 | 统一整体和个体 | 组织架构树 | HashMap、SqlNode |
适配器模式(Adapter) | 适合自己的,才是最好的 | 兼容转换 | 电源适配 | AdvisorAdapter、HandlerAdapter |
桥接模式(Bridge) | 约定优于配置 | 不允许用继承 | 桥 | DriverManager |
委派模式(Delegate) | 这个需求很简单,怎么实现我不管 | 只对结果负责 | 授权委托书 | ClassLoader、BeanDefinitionParserDelegate |
模板模式(Template) | 流程全部标准化,需要微调 | 逻辑复用 | 把大象装进冰箱 | JdbcTemplate、HttpServlet |
策略模式(Strategy) | 条条大路通罗马,具体哪条你来定 | 把选择权交给用户 | 选择支付方式 | Comparator、InstantiationStrategy |
责任链模式(Chain of Responsibility) | 各人自扫门前雪,莫管他人瓦上霜 | 解耦处理逻辑 | 踢皮球 | FilterChain、Pipeline |
迭代器模式(Iterator) | 流水线上坐一天,每个包裹扫一遍 | 统一对集合的访问方式 | 逐个检票进站 | Iterator |
命令模式(Command) | 运筹帷幄之中,决胜千里之外 | 解耦请求和处理 | 遥控器 | Runnable、TestCase |
状态模式(State) | 状态驱动行为,行为决定状态 | 绑定状态和行为 | 订单状态跟踪 | Lifecycle |
备忘录模式(Memento) | 给我一剂“后悔药” | 备份 | 草稿箱 | StateManageableMessageContext |
中介者模式(Mediator) | 联系方式我给你,怎么搞定我不管 | 统一管理网状资源 | 朋友圈 | Timer |
解释器模式(Interpreter) | 我想说“方言”,一切解释权归我所有 | 实现特定语法解析 | 摩斯密码 | Pattern、ExpressionParser |
观察者模式(Observer) | 到点就通知我 | 解耦观察者与被观察者 | 闹钟 | ContextLoaderListener |
访问者模式(Visitor) | 横看成岭侧成峰,远看高低各不同 | 解耦数据结构和数据操作 | KPI考核 | FileVisitor、BeanDefinitionVisitor |
设计模式之间的关联关系和对比
- 单例模式和工厂模式
实际业务代码中,通常把工厂类设计为单例
- 策略模式和工厂模式
1、工厂模式包含工厂方法模式和抽象工厂模式是创建型模式,策略模式属于行为型模式
2、工厂模式主要目的是封装好创建逻辑,策略模式接收工厂创建好的对象,从而实现不同的行为
- 策略模式和委派模式
1、策略模式是委派模式内部的一种实现方式,策略模式关注的结果是否能相互替代
2、委派模式更关注分发和调度的过程
- 模板方法模式和工厂方法模式
工厂方法是模板方法的一种特殊实现
- 模板方法模式和策略模式
1、模式方法和策略模式都有封装算法
2、策略模式是使不同算法可以相互替换,且不影响客户端应用层的使用
3、模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现
4、模板方法模式不能改变算法流程,策略模式可以改变算法流程且可替换,策略模式通常用来代替if...else...等条件分支语句
- 装饰者模式和静态代理模式
1、装饰者模式关注点在于给对象动态添加方法,而代理更加注重控制对对象的访问
2、代理模式通常会在代理类中创建被代理对象的实例,而装饰者模式通常把被装饰者作为构造参数
3、装饰者和代理者虽然都持有对方引用,但逻辑处理重心是不一样的
- 装饰者模式和适配器模式
1、装饰者模式和适配器模式都是属于包装器模式(Wrapper Pattern)
2、装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配器和被适配器可以实现不同的接口
- 适配器模式和静态代理模式
适配器可以接口静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式
- 适配器模式和策略模式
在适配业务复杂的情况下,利用策略模式优化动态适配逻辑
- 模板方法模式和建造者模式
两者很大的交集,建造者模式比模板方法模式多了一个指挥类,该类体现的是模板方法模式中抽象类的固定算法的功能,是一个创建对象的固定算法
- 状态模式和策略模式
1、状态模式重点在各状态之间的切换,从而做不同的事情,策略模式更侧重于根据具体情况选择策略,并不涉及切换
2、状态模式不同状态下做的事情不同,而策略模式做的都是同一件事。例如,聚合支付平台,有支付宝、微信支付、银联支付,虽然策略不同,但最终做的事情都是支付
3、状态模式,各个状态的同一方法做的是不同的事,不能互相替换
- JDK动态代理和CGLIB动态代理区别
1、JDK动态代理:要求目标对象实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以用CGLib动态代理
2、CGLib动态代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展
3、JDK动态代理是自带的,CGlib需要引入第三方包
4、CGLib动态代理基于继承来实现代理,所以无法对final类、private方法和static方法实现代理
本文地址:https://blog.csdn.net/vincent_wen0766/article/details/109625090
下一篇: 设计模式之装饰器模式