设计模式:Mybatis中应用的经典设计模式

Mybatis中的设计模式

简介

  1. 众所周知,常用设计模式一共有26种
  2. 日常大多停留在概念层面,实际开发较少使用
  3. Mybatis可谓将各种设计模式用到极致,源码中使用了大量设计模式
  4. 这里可以举出一些典型例子:
    • Builder模式(也叫建造者模式),SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder
    • 工厂模式:SqlSessionFactory、ObjectFactory、MapperProxyFactory
    • 单利模式:ErrorContext和LogFactory
    • 代理模式:MapperProxy、ConnectionLogger,用的jdk的动态代理,还有executor.loader包使用了cglib动态代理等
    • 组合模式:SqlNode和各个子类ChooseSqlNode
    • 模板方法模式:BaseExecutor和SimpleExecutor
    • 适配器模式:Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现
    • 装饰器模式:Cache包中的cache.decorators子包中等各个装饰者的实现
    • 迭代器模式:PropertyTokenizer等

Builder模式

将一个复杂对象的构建与表示分离,使得同样的构建过程,可以创建不同的表示。一般创建复杂对象时,可使用工厂模式或Builder模式。而工程模式一般是直接生产一个完整的产品,Builder一般只会构建产品的一部分。故Builder更适合构建更加复杂的产品。

  1. Mybatis中,SqlSessionFactoryBuilder过程及其复杂
  2. 可以查看其源码,内部定了较多build重载方法

工厂模式

  1. 分简单工厂模式、工厂方法模式与抽象工厂模式等
  2. Mybatis中的SqlSessionFactory使用的是简单工厂模式
  3. 简单工厂模式又成静态工厂方法模式
  4. 逻辑就是根据参数的不同,返回不同类的实例
  5. 这些被创建的类通常都有一个共同的父类
  6. 简单工厂模式,就专门为创建这些类,定义一个工程类来创建实例

单例模式

  1. 确保某个类在全局只有一个实例
  2. 且自行实例化并向全局提供这个实例
  3. Mybatis中ErrorContext和LogFactory就是典型单利模式
  4. 实现:将构造函数私有化,提供一个静态的获取instance的方法
  5. 局部定义一个私有的静态实例
  6. 获取的时候判断该实例是否存在,存在则返回
  7. 单例又分懒汉式与饿汉式
  8. 思考:懒汉式与饿汉式的线程安全问题

代理模式

  1. Mybatis核心使用的模式
  2. 正因如此,我们只需编写Mapper接口,而无需编写实现类
  3. 概念:给某对象提供一个代理类,并由代理对象控制原对象的引用
  4. 代理模式属于结构型模式

    设计模式:Mybatis中应用的经典设计模式_第1张图片

  5. 查看示例代码

组合模式

  1. Mybatis支持动态SQL的机制,就是基于组合模式设计
  2. 概念:将一组相似的对象当作一个单一的对象,依据树形结构来组合
  3. 可以清晰的表示不服及整体的层次关系
  4. 属于结构型模式

    设计模式:Mybatis中应用的经典设计模式_第2张图片

模板方法模式

  1. 基于继承的代码复用的基本技术
  2. BaseExecutor就采用了模板方法模式
  3. 定义抽象类,公开定义其执行它方法的方式,其子类按需重写方法的实现
  4. 调用时,以抽象类中的定义的方式进行调用
  5. 属于行为型模式
  6. 行为由父类控制,子类实现

    设计模式:Mybatis中应用的经典设计模式_第3张图片

适配器模式

  1. 将一个接口转换成客户希望的另一个接口
  2. 使接口不兼容的类可以一起工作
  3. 属于结构型模式
  4. 类似读卡器就是作为内存卡和笔记本之间的适配器

    设计模式:Mybatis中应用的经典设计模式_第4张图片

装饰者模式

  1. 动态地给一个对象增加一些额外的职责
  2. 属于对象结构型模式
  3. 特点:不改变原类、不使用继承、动态扩展
  4. Mybatis中用于装饰PerpetualCache的装饰器有8个

迭代器模式

  1. 概念:提供一种方法,可访问一个容器对象中各个元素,而又不暴露改对象的细节
  2. Java的Iterator就是迭代器模式的接口,只要实现了该接口,就相当于应用了迭代器模式
  3. 比如Mybatis的PropertyTokenizer
  4. 常用于访问一个容器中对象的元素,而无需关心对象底层的表示

    设计模式:Mybatis中应用的经典设计模式_第5张图片

你可能感兴趣的:(#,网课笔记,设计模式,java,python,编程语言,mybatis)