通过mybatis源码学习设计模式---工厂模式

📢📢📢📣📣📣
哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝
一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜
喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜

✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
————————————————

目录

⛳️ 1.简单工厂

举个例子🌰🌰

1. 创建抽象产品类

2. 创建具体产品类

3. 创建⼯⼚类

测试:

⛳️ 2.Mybatis 体现: 


⛳️ 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智达教育‍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值