文章由浅入深,先用简单例子说明建造者,然后分析模式的优缺点,最后结合优秀开源框架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设计模式之策略模式

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

JAVA设计模式之简单粗暴学建造者模式的更多相关文章

  1. java设计模式(二)单例模式 建造者模式

    (三)单例模式 单例模式应该是最常见的设计模式,作用是保证在JVM中,该对象仅仅有一个实例存在. 长处:1.降低某些创建比較频繁的或者比較大型的对象的系统开销. 2.省去了new操作符,减少系统内存使 ...

  2. Java设计模式(四)Builder建造者模式

    一.场景描述 建造者模式同工厂模式.抽象工厂模式一样,用于创建继承类对象. 工厂模式:http://www.cnblogs.com/mahongbiao/p/8618970.html 抽象工厂模式:h ...

  3. Java设计模式菜鸟系列(十五)建造者模式建模与实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39863125 建造者模式(Builder):工厂类模式提供的是创建单个类的模式.而建造者模 ...

  4. Java设计模式之(三)——建造者模式

    1.什么是建造者模式 Separate the construction of a complex object from its representation so that the same co ...

  5. 设计模式之第11章-建造者模式(Java实现)

    设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...

  6. Java设计模式(14)责任链模式(Chain of Responsibility模式)

    Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

  7. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  8. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  9. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

随机推荐

  1. This 在构造函数中的固定用法

    class Person{ String name; int age; char gender; public Person (String name){ this.name = name; } pu ...

  2. arcEngine开发之查看属性表

    这篇文章给出实现属性表功能的具体步骤,之后再对这些步骤中的代码进行分析. 环境准备 拖动TOCControl.MapControl控件到Form窗体上,然后拖动ContextMenuStrip控件至T ...

  3. 如何识别企业内的“千里马”?

    很多企业主都在感叹无法找到合适的优秀管理人才,却忽视了一条获得管理人才的捷径:内部培养.在员工中挑选具有领导潜质的人才,加以培养,必成企业栋梁,而且这样选拔的人才与企业的契合度.忠诚度方面都相对较高. ...

  4. elasticSearch+spring 整合 maven依赖详解

    摘自:http://www.mayou18.com/detail/nTxPQSyu.html [Elasticsearch基础]elasticSearch+spring 整合 maven依赖详解 Ma ...

  5. Python实现批量新建SecureCRT Session

    最近因为工作需要,我需要在ssh的时候保存几千台网关的session,工作量相当大(也就是ssh的时候需要记住用户名和密码,然后还要再session选项中录入enable密码,相当繁琐),而且设备的用 ...

  6. python 工具安装

    1. whl文件的安装:pip install 文件名.whl 2. 压缩包中有setup.py的安装:python setup.py install 3. 利用anaconda下载安装:conda ...

  7. TestNG 自动化测试入门教程--典型示例

    TestNG介绍 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit,   功能都差不多, 只是功能更加强大,使用也更方便 Java中已经有一个JUnit的测试框架了.  Tes ...

  8. 利用 ssh 的用户配置文件 config 管理 ssh 会话

    http://dhq.me/use-ssh-config-manage-ssh-session 利用 ssh 连接远程服务器,一般都要输入以下类似命令: 1 ssh user@hostname -p ...

  9. 简书markdown教程

    1 支持 Markdown 的编辑器 Windows 推荐 Sublime Text 3,强大优雅的编辑器.MarkdownPad,一款可以直接预览排版效果的编辑器. Mac 推荐 Ulysess,专 ...

  10. sql复杂案例

    工作中往往会遇到非常棘手的数据查询,运营人员不知道你的数据库表是如何设计的,也不知道你的数据库记录了啥数据,他只知道自己需要看什么数据,甚至有些数据根本就不存在. 单表查询的难度: 一张数据库的表ta ...