合集总览:Mybatis框架梳理
说一下我的理解:设计模式是对项目工程中代码结构的设计和抽象,有了这种设计和抽象,系统才有了扩展性。记住了模式的角色、组成、UML类图,只是记住了模式的形,类似武术中的拳法套路。模式的意则是一个不断学习和加深理解的过程,通过对比优秀框架中相应设计模式的具体运用来加深理解,最终融入自己的设计和编码习惯中。
当然,如果关注点是代码能运行,也无可厚非。
工厂模式
工厂模式是将对象的创建和使用分离,对上层调用者来说屏蔽了复杂的对象创建过程,对代码维护来说集中了代码的管理,避免相同逻辑散落各处,一处修改,处处生效。
工厂模式是如何屏蔽创建过程的呢?在形式上,它将对象创建的逻辑定义在另一个类中,仅仅是这样的话,静态工具类也可以实现代码形式上的解耦和屏蔽。
工厂模式是通过抽象来实现分离的,或者说抽象是实现分离的惯用手段。提到抽象,首先想到的就是接口。接口仅定义规范和协议,从而满足了抽象。工厂模式通过返回接口从而实现了分离
。
比如Mybatis中的SqlSessionFactoryBuilder
public class SqlSessionFactoryBuilder {
public SqlSessionFactory build(){}
}
这个类只做一件事,只有一个
build
方法,通过重载支持不同的入参情况。重点是通过返回接口类型,所以调用者才能不关心过程,仅关注返回对象的类型,从而实现概念上的屏蔽,实现解耦。
在这种情况下,调用者不仅不关心对象创建的过程,甚至不关心返回的是哪一类型的实例,只要返回的对象满足接口定义即可
。
题外话
稍微观察一下
SqlSessionFactoryBuilder
这个类,你会发现,目前版本中,该工厂只返回一种类型的实例DefaultSqlSessionFactory
。虽然Mybatis内部SqlSessionFactory
有两个实现类,但SqlSessionManager
内部依旧是通过SqlSessionFactoryBuilder
工厂创建DefaultSqlSessionFactory
来返回:
public static SqlSessionManager newInstance(Reader reader) {
return new SqlSessionManager(new SqlSessionFactoryBuilder().build(reader, null, null));
}
所以在Mybatis中使用的
SqlSessionFactory
都是DefaultSqlSessionFactory
类型。当然,由于SqlSessionFactoryBuilder
并没有使用final修饰,你可以通过继承并覆写build
来扩展自定义的SqlSessionFactory
。