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

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

一、先定义一个机器人模型设计模式

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;
    }
}

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

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

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方法就能够返回一个咱们想要的机器人。ide

三、如今机器人的模型和建立标准都有了,让咱们来实现一个会跳舞的机器人。模块化

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呢,就是来执行咱们刚才的造人动做的。没错,精髓就是咱们刚才的造人动做。咱们先看代码:测试

四、指挥官Directorui

public class Director {
    public Human createRobotByDirecotr(IBuildRobot ibr){
        ibr.buildBody();
        ibr.buildFoot();
        ibr.buildHand();
        ibr.buildHead(); 
        return ibr.createRobot ();
    }
}

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

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

五、测试

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("机器人建立成功,恭喜!");
    } 
}

六、结果

如今咱们想要个会唱歌的机器人,就能够像跳舞机器人那样建好类。交给Director,它就能够给你建出来了。

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

 七、总结

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

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

二、  代码解耦,模块化,方便维护。产品自己与建立过程解耦,可使用相同的建立过程获得不一样的产品。

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

 八、开源框架Mybatis中建造者模式的应用

一、Mybatis中用到的建造者模式:

SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder等

二、举个我读Mybatis源码的例子:

XMLConfigBuilder读取配置文件构建出Configuration对象,而后SqlSessionFactoryBuilder使用Configuration对象做为参数,构建出SqlSessionFactory对象。

三、分析缘由

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

九、个人其余设计模式

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

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

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

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

相关文章
相关标签/搜索