📢📢📢📣📣📣
哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝
一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜
✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
————————————————
目录
⛳️ 1.简单工厂
在Mybatis中⽐如SqlSessionFactory使⽤的是⼯⼚模式,该⼯⼚没有那么复杂的逻辑,是⼀个简单⼯⼚ 模式。
简单⼯⼚模式(Simple Factory Pattern):⼜称为静态⼯⼚⽅法(Static Factory Method)模式,它属于创 建型模式。
在简单⼯⼚模式中,可以根据参数的不同返回不同类的实例。简单⼯⼚模式专⻔定义⼀个类来负责创建 其他类的实例,被创建的实例通常都具有共同的⽗类。
工厂模式是一个很具体的方式,我们能够通过实际中的工厂🏭来进行理解,给什么材料就创造什么产品。
还拿电脑💻来说,我们传入电脑的材料,通过工厂的这个流程之后,就为我们创建完电脑这个产品了。
例⼦:⽣产电脑
假设有⼀个电脑的代⼯⽣产商,它⽬前已经可以代⼯⽣产联想电脑了,随着业务的拓展,这个代⼯⽣产 商还要⽣产惠普的电脑,我们就需要⽤⼀个单独的类来专⻔⽣产电脑,这就⽤到了简单⼯⼚模式。
举个例子🌰🌰
下⾯我们来实现简单⼯⼚模式:
1. 创建抽象产品类
我们创建⼀个电脑的抽象产品类,他有⼀个抽象⽅法⽤于启动电脑:
public abstract class ComputerProduct {
/**
* 产品的抽象方法,由具体的产品类去实现
*/
public abstract void start();
}
2. 创建具体产品类
接着我们创建各个品牌的电脑,他们都继承了他们的⽗类Computer,并实现了⽗类的start⽅法:
public class LenovoComputer extends ComputerProduct {
@Override
public void start() {
System.out.println("联想电脑工厂启动了...");
}
}
public class AppleComputer extends ComputerProduct {
@Override
public void start() {
System.out.println("苹果电脑工厂启动了...");
}
}
3. 创建⼯⼚类
接下来创建⼀个⼯⼚类,它提供了⼀个静态⽅法createComputer⽤来⽣产电脑。你只需要传⼊你 想⽣ 产的电脑的品牌,它就会实例化相应品牌的电脑对象
public class ComputerFactory {
public static ComputerProduct createComputer(String type) {
ComputerProduct computer = null;
switch (type) {
case "lenovo":
computer = new LenovoComputer();
break;
case "apple":
computer = new AppleComputer();
break;
}
return computer;
}
}
测试:
public class ComputerFactoryTest {
public static void main(String[] args) {
ComputerFactory.createComputer("apple").start();
ComputerFactory.createComputer("lenovo").start();
}
}
⛳️ 2.Mybatis 体现:
Mybatis中执⾏Sql语句、获取Mappers、管理事务的核⼼接⼝SqlSession的创建过程使⽤到了⼯⼚模 式。 有⼀个 SqlSessionFactory 来负责 SqlSession 的创建
SqlSessionFactory 可以看到,该Factory的openSession ()⽅法重载了很多个,分别⽀ 持autoCommit、Executor、Transaction等参数的输⼊,来构建核⼼的SqlSession对象。
在DefaultSqlSessionFactory的默认⼯⼚实现⾥,有⼀个⽅法可以看出⼯⼚怎么产出⼀个产品:
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
//获得 运行环境对象
final Environment environment = configuration.getEnvironment();
//创建事务对象
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
//通过事务工厂来产生一个事务
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
//生成一个执行器(事务包含在执行器里) 根据参数创建指定类型的Executor SIMPLE, REUSE, BATCH 默认是SIMPLE
final Executor executor = configuration.newExecutor(tx, execType);
//然后产生一个 DefaultSqlSession
return new DefaultSqlSession(configuration, executor, autoCommit);
} catch (Exception e) {
//如果打开事务出错,则关闭它
closeTransaction(tx); // may have fetched a connection so lets call close()
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
//最后清空错误上下文
ErrorContext.instance().reset();
}
}
这是⼀个openSession调⽤的底层⽅法,该⽅法先从configuration读取对应的环境配置,然后初始化 TransactionFactory 获得⼀个 Transaction 对象,然后通过 Transaction 获取⼀个 Executor 对象,最 后通过configuration、Executor、是否autoCommit三个参数构建了 SqlSession