文章由浅入深, 先用简单例子说明建造者, 然后分析模式的优缺点, 最后结合优秀开源框架 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, 结果
现在我们想要个会唱歌的机器人, 就可以像跳舞机器人那样建好类. 交给 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 设计模式之策略模式
来源: https://www.cnblogs.com/luohanguo/p/10455745.html