欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA设计模式之简单粗暴学建造者模式

程序员文章站 2022-05-14 09:32:37
简单粗暴学建造者模式,含Mybatis框架源码中建造者模式运用分析。 ......

文章由浅入深,先用简单例子说明建造者,然后分析模式的优缺点,最后结合优秀开源框架mybatis,说明该模式的用处。

1、先定义一个机器人模型

package com.jstao.model;

public class robot {
    private string head;
    private string body;
    private string hand;
    private string foot;
    public string gethead() {
        return head;
    }
    public void sethead(string head) {
        this.head = head;
    }
    public string getbody() {
        return body;
    }
    public void setbody(string body) {
        this.body = body;
    }
    public string gethand() {
        return hand;
    }
    public void sethand(string hand) {
        this.hand = hand;
    }
    public string getfoot() {
        return foot;
    }
    public void setfoot(string foot) {
        this.foot = foot;
    }
}

这就是机器人模型,有头,有身体,有手,有脚。机器人都是由这个模型出来的。

2、接下来定义一个造机器人的标准。一个把头、身体、手、脚造出来的标准。

package com.jstao.service;

import com.jstao.model.robot;

public interface ibuildrobot {
    public void buildhead();
    public void buildbody();
    public void buildhand();
    public void buildfoot();
    public robot createrobot ();

}

这样,一个建造机器人的标准就定义好了。依次创建各个部位,最后调用createrobot方法就可以返回一个我们想要的机器人。

3、现在机器人的模型和创建标准都有了,让我们来实现一个会跳舞的机器人。

package com.jstao.service.impl;

import com.jstao.model.robot;
import com.jstao.service.ibuildrobot;

public class dancerobotbuilder implements ibuildrobot {
    robot robot;
    public dancerobotbuilder(){
        robot = new robot ();
    }
    @override
    public void buildhead() {
        robot.sethead("写入机械舞程序");       
    }
    @override
    public void buildbody() {
        robot.setbody("钛合金身体");
    }
    @override
    public void buildhand() {
        robot.sethand("钛合金手");      
    }
    @override
    public void buildfoot() {
        robot.setfoot("钛合金脚");
    }
    @override
    public robot createrobot () {
        return robot;
    }

}

这个会跳机械舞的机器实现了ibuildrobot造机器人标准的接口,最后提供了createrobot方法返回robot实体。

好的,其实到这里呢,我们已经完成了建造的过程。那就这么简单的建造过程,还搞了一个建造模式吗?非也。接下来,就是介绍建造者模式的精髓,那就是director。这个director呢,就是来执行我们刚才的造人动作的。没错,精髓就是我们刚才的造人动作。我们先看代码:

4、指挥官director

public class director {
    public human createrobotbydirecotr(ibuildrobot ibr){
        ibr.buildbody();
        ibr.buildfoot();
        ibr.buildhand();
        ibr.buildhead(); 
        return ibr.createrobot ();
    }
}

建好了,这个director类就跟个指挥官似,它有资源和工厂的。你跟它说要建造什么类型的机器人,只要传给它。它就给能你建造出来。

我们来看下它是怎么造出来的:

5、测试

package com.jstao.main;

import com.jstao.controller.director;
import com.jstao.model.robot;
import com.jstao.service.impl.dancerobotbuilder;

public class buildertest {
    public static void main(string[] args){
        director director = new director();
        robot robot = director.createrobotbydirecotr(new dancerobotbuilder ());
        system.out.println(robot.gethead());
        system.out.println(robot.getbody());
        system.out.println(robot.gethand());
        system.out.println(robot.getfoot());
        system.out.println("机器人创建成功,恭喜!");
    } 
}

6、结果

JAVA设计模式之简单粗暴学建造者模式

现在我们想要个会唱歌的机器人,就可以像跳舞机器人那样建好类。交给director,它就可以给你建出来了。

最后再来看下builder模式的定义:“将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。“好理解点了吧。

 7、总结

感受一下,建造者模式的好处有:

1、  易于拓展。想要建唱歌机器人只要单独将这个类像跳舞人那样建好,交给director就可以了。无需修改原有代码。符合“开闭原则”。

2、  代码解耦,模块化,方便维护。产品本身与创建过程解耦,可以使用相同的创建过程得到不同的产品。

短板有:使用范围有限。建造者模式创造出来的产品,其组成部分基本相同。如果产品之间的差异较大,则不适用这个模式。

 8、开源框架mybatis中建造者模式的应用

1、mybatis中用到的建造者模式:

sqlsessionfactorybuilder、xmlconfigbuilder、xmlmapperbuilder、xmlstatementbuilder、cachebuilder等

2、举个我读mybatis源码的例子:

xmlconfigbuilder读取配置文件构建出configuration对象,然后sqlsessionfactorybuilder使用configuration对象作为参数,构建出sqlsessionfactory对象。

3、分析原因

这么做的原因是mybatis的初始化工作较复杂,不是一个构造函数就能包括的。所以采用了分层构建方法。例如mybatis中极其重要的configuration对象,它庞大且复杂,初始化比较麻烦,所以使用专门的建造者xmlconfigbuilder进行构建。

9、我的其他设计模式

(1)java设计模式之观察者模式

(2)java设计模式之适配器模式

(3)java设计模式之策略模式

你的支持是我的动力,最后笔记对你有用,别忘了点赞支持下哦。