Builder构建者模式及在MyBatis框架中的体现

本文详细介绍了Builder模式在计算机组件构建(如电脑)和Mybatis初始化过程中的运用,通过ComputerBuilder实例展示如何一步步构造复杂对象,并阐述了在Mybatis中SqlSessionFactoryBuilder使用Builder模式构建核心配置的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 模式介绍

Builder模式的定义是"将⼀个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。,它属于创建类模式,⼀般来说,如果⼀个对象的构建⽐较复杂,超出了构造函数所能包含的范 围,就可以使⽤⼯⼚模式 Builder模式,相对于⼯⼚模式会产出⼀个完整的产品,Builder应⽤于更加 复杂的对象的构建,甚⾄只会构建产 品的⼀个部分,直⽩来说,就是使⽤多个简单的对象⼀步⼀步构建 成⼀个复杂的对象。
例⼦:使⽤构建者设计模式来⽣产computer

(一)主要步骤:

1、将需要构建的⽬标类分成多个部件(电脑可以分为主机、显示器、键盘、⾳箱等部件);
2、 创建构建类;
3、 依次创建部件;
4、 将部件组装成⽬标对象

(二)定义computer

package com.lagou.constructor;

public class Computer {
    // 显示器
    private String displayer;
    // 主机
    private String mainUnit;
    // 鼠标
    private String mouse;
    // 键盘
    private String keyboard;

    @Override
    public String toString() {
        return "Computer{" +
                "displayer='" + displayer + '\'' +
                ", mainUnit='" + mainUnit + '\'' +
                ", mouse='" + mouse + '\'' +
                ", keyboard='" + keyboard + '\'' +
                '}';
    }

    public String getDisplayer() {
        return displayer;
    }

    public void setDisplayer(String displayer) {
        this.displayer = displayer;
    }

    public String getMainUnit() {
        return mainUnit;
    }

    public void setMainUnit(String mainUnit) {
        this.mainUnit = mainUnit;
    }

    public String getMouse() {
        return mouse;
    }

    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    public String getKeyboard() {
        return keyboard;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }
}

(三)创建ComputerBuilder

package com.lagou.constructor;

public class ComputerBuilder {

    private Computer computer = new Computer();


    public void installDisplayer(String displayer){
        computer.setDisplayer(displayer);
    }

    public void installMainUnit(String mainUnit){
        computer.setMainUnit(mainUnit);
    }

    public void installmouse(String mouse){
        computer.setMouse(mouse);
    }

    public void installkeyboard(String keyboard){
        computer.setKeyboard(keyboard);
    }

    public Computer getComputer(){
        return computer;
    }


}

(四)调⽤

package com.lagou.constructor;

public class ConsructorTest {

    public static void main(String[] args) {
        ComputerBuilder computerBuilder = new ComputerBuilder();
        computerBuilder.installDisplayer("显示器");
        computerBuilder.installMainUnit("主机");
        computerBuilder.installmouse("鼠标");
        computerBuilder.installkeyboard("键盘");

        Computer computer = computerBuilder.getComputer();
        System.out.println(computer);


    }


}

二. 构建者设计模式Mybatis中的体现

SqlSessionFactory 的构建过程:
Mybatis的初始化⼯作⾮常复杂,不是只⽤⼀个构造函数就能搞定的。所以使⽤了建造者模式,使⽤了⼤ 量的Builder,进⾏分层构造,核⼼对象Configuration使⽤了 XmlConfigBuilder来进⾏构造

 

Mybatis环境的初始化过程中,SqlSessionFactoryBuilder会调⽤XMLConfigBuilder读取所有的
MybatisMapConfig.xml 和所有的 *Mapper.xml ⽂件,构建 Mybatis 运⾏的核⼼对象 Configuration 对 象,然后将该Configuration对象作为参数构建⼀个SqlSessionFactory对象。
private void parseConfiguration(XNode root) {
try {
 //issue #117 read properties first
 //解析<properties />标签
 propertiesElement(root.evalNode("properties"));
 // 解析 <settings /> 标签
 Properties settings = settingsAsProperties(root.evalNode("settings"));
 //加载⾃定义的VFS实现类
 loadCustomVfs(settings);
 // 解析 <typeAliases /> 标签
 typeAliasesElement(root.evalNode("typeAliases"));
 //解析<plugins />标签
 pluginElement(root.evalNode("plugins"));
 // 解析 <objectFactory /> 标签
 objectFactoryElement(root.evaINode("obj ectFactory"));
 // 解析 <objectWrapper Factory /> 标签
 obj ectWrappe rFacto ryElement(root.evalNode("objectWrapperFactory"));
 // 解析 <reflectorFactory /> 标签
 reflectorFactoryElement(root.evalNode("reflectorFactory"));
 // 赋值 <settings /> 到 Configuration 属性
 settingsElement(settings);
 // read it after objectFactory and objectWrapperFactory issue #631
 // 解析 <environments /> 标签
environmentsElement(root.evalNode("environments"));
 // 解析 <databaseIdProvider /> 标签
 databaseldProviderElement(root.evalNode("databaseldProvider"));
}
其中 XMLConfigBuilder 在构建 Configuration 对象时,也会调⽤ XMLMapperBuilder ⽤于读取 *Mapper ⽂件,⽽XMLMapperBuilder会使⽤XMLStatementBuilder来读取和build所有的SQL语句。
//解析<mappers />标签
mapperElement(root.evalNode("mappers"));
在这个过程中,有⼀个相似的特点,就是这些Builder会读取⽂件或者配置,然后做⼤量的XpathParser 解析、配置或语法的解析、反射⽣成对象、存⼊结果缓存等步骤,这么多的⼯作都不是⼀个构造函数所 能包括的,因此⼤量 采⽤了 Builder模式来解决。

 

SqlSessionFactoryBuilder类根据不同的输⼊参数来构建SqlSessionFactory这个⼯⼚对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值