设计模式: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. 代理模式属于结构型模式

  5. 查看示例代码

组合模式

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

模板方法模式

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

适配器模式

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

装饰者模式

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

迭代器模式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值