创建型模式
创建型模式(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)是对在不同的对象之间划分责任和算法的抽象化,用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。
行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。
通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象 之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。
行为型模式分为:
-
类行为模式,采用继承机制来在类间分派行为,有模板方法模式和解释器模式
-
对象行为模式,采用组合或聚合在对象间分配行为,其余9个模式均为对象行为模式
由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。
行为型模式共有 11种
模式 | 核心 | 遵循规则 | 违背规则 | 举例 |
---|---|---|---|---|
模板方法 | 定义一个算法骨架,子类修改其中特定步骤 | 里式替换 | BeanFactory中的onRefresh | |
策略 | 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换 | 单一、迪米特、依赖倒置 | InstantiationStrategy | |
命令 | 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开 | 迪米特 | ||
职责链 | 把请求从链中的一个对象传到下一个对象,直到请求被响应为止 | 迪米特 | Tomcat的一键启停,每一层容器启动或停止下一层容器 | |
状态 | 对象在其内部状态发生改变时改变其行为能力 | 单一、迪米特、依赖倒置 | 各种上下文 | |
观察者 | 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为 | 迪米特、单一 | 生产者-消费者模式/发布订阅模式 | |
中介 | 定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解(可以互相访问,代理只能单向) | 迪米特 | 单一 | |
迭代器 | 提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示(倾向于顺序访问全部) | 开闭 | Java中的集合类 | |
访问者 | 在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式(倾向于单个复杂元素多种访问方式) | BeanDefinitionVisitor(多次操作,每次读取BeanDefinition中的一个参数) | ||
备忘录 | 在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它 | 迪米特 | 浏览器回退 | |
解释器 | 提供如何定义语言的文法,以及对语言句子的解释方法 | 单一 | EpressionParser |
参考文章:
《大话设计模式》
网友评论