栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020264.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号