23中设计模式的对比

2020-09-07  本文已影响0人  云中人山

创建型模式

创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。

创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

模式 核心 遵循规则 违背规则 举例
单例 全局唯一 单一职责 Spring中的Bean,默认即为单例
工厂方法 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类 单一职责、开闭原则
抽象工厂 将工厂再进行抽象(工厂类实现接口) 单一职责、开闭原则、依赖倒置 Spring中的工厂类
原型 每次产生新的对象 session等
建造者 按一定顺序生产一批产品,并组合后输出 单一职责 开闭原则 Spring中Builder结尾的类

结构型

结构型模式(Structural Pattern)描述如何将类或者对 象结合在一起形成更大的结构,就像搭积木,可以通过 简单积木的组合形成复杂的、功能更为强大的结构。

结构型模式可以分为类结构型模式和对象结构型模式:

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观(门面)模式、桥接模式、组合模式(部分-整体模式 )、享元模式。

模式 核心 遵循规则 违背规则 举例
适配器 接口转换 开闭 Adaptor结尾的类 如MessageListenerAdapter
装饰器 动态地给对象增加一些职责 单一、开闭、迪米特 里式替换 BeanDefinitionDecorator
代理 为某对象提供一种代理以控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性 Cglib动态代理 比如Mybatis的Mapper
外观 复杂的流程封装成一个接口 迪米特 Facade结尾的类
桥接 将抽象和实现解耦, 使得两者可以独立地变化(用组合关系代替继承关系来实现的) 单一、开闭、迪米特 ViewRendererServlet
组合 将对象组合成树形结构以表示"部分-整体"的层次结构将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性 迪米特。开闭 依赖倒置 HandlerMethodArgumentResolverComposite
享元 共享创建难度大,或者消耗资源多的资源 String的实现 数据库连接池

行为型

行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化,用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。

行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。

通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象 之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。

行为型模式分为:

行为型模式共有 11种

模式 核心 遵循规则 违背规则 举例
模板方法 定义一个算法骨架,子类修改其中特定步骤 里式替换 BeanFactory中的onRefresh
策略 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换 单一、迪米特、依赖倒置 InstantiationStrategy
命令 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开 迪米特
职责链 把请求从链中的一个对象传到下一个对象,直到请求被响应为止 迪米特 Tomcat的一键启停,每一层容器启动或停止下一层容器
状态 对象在其内部状态发生改变时改变其行为能力 单一、迪米特、依赖倒置 各种上下文
观察者 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为 迪米特、单一 生产者-消费者模式/发布订阅模式
中介 定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解(可以互相访问,代理只能单向) 迪米特 单一
迭代器 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示(倾向于顺序访问全部) 开闭 Java中的集合类
访问者 在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式(倾向于单个复杂元素多种访问方式) BeanDefinitionVisitor(多次操作,每次读取BeanDefinition中的一个参数)
备忘录 在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它 迪米特 浏览器回退
解释器 提供如何定义语言的文法,以及对语言句子的解释方法 单一 EpressionParser

参考文章:

[设计模式在 Spring 框架中的良好应用]

设计模式大杂烩

设计模式在 Spring 框架中的良好应用

《大话设计模式》

上一篇 下一篇

猜你喜欢

热点阅读