JAVA设计模式之简单粗暴学建造者模式
文章由浅入深,先用简单例子说明建造者,然后分析模式的优缺点,最后结合优秀开源框架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、我的其他设计模式
你的支持是我的动力,最后笔记对你有用,别忘了点赞支持下哦。
JAVA设计模式之简单粗暴学建造者模式的更多相关文章
- java设计模式(二)单例模式 建造者模式
(三)单例模式 单例模式应该是最常见的设计模式,作用是保证在JVM中,该对象仅仅有一个实例存在. 长处:1.降低某些创建比較频繁的或者比較大型的对象的系统开销. 2.省去了new操作符,减少系统内存使 ...
- Java设计模式(四)Builder建造者模式
一.场景描述 建造者模式同工厂模式.抽象工厂模式一样,用于创建继承类对象. 工厂模式:http://www.cnblogs.com/mahongbiao/p/8618970.html 抽象工厂模式:h ...
- Java设计模式菜鸟系列(十五)建造者模式建模与实现
转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39863125 建造者模式(Builder):工厂类模式提供的是创建单个类的模式.而建造者模 ...
- Java设计模式之(三)——建造者模式
1.什么是建造者模式 Separate the construction of a complex object from its representation so that the same co ...
- 设计模式之第11章-建造者模式(Java实现)
设计模式之第11章-建造者模式(Java实现) “那个餐厅我也是醉了...”“怎么了?”“上菜顺序啊,竟然先上甜品,然后是冷饮,再然后才是菜什么的,无语死了.”“这个顺序也有人这么点的啊.不过很少就是 ...
- Java设计模式(14)责任链模式(Chain of Responsibility模式)
Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
随机推荐
- This 在构造函数中的固定用法
class Person{ String name; int age; char gender; public Person (String name){ this.name = name; } pu ...
- arcEngine开发之查看属性表
这篇文章给出实现属性表功能的具体步骤,之后再对这些步骤中的代码进行分析. 环境准备 拖动TOCControl.MapControl控件到Form窗体上,然后拖动ContextMenuStrip控件至T ...
- 如何识别企业内的“千里马”?
很多企业主都在感叹无法找到合适的优秀管理人才,却忽视了一条获得管理人才的捷径:内部培养.在员工中挑选具有领导潜质的人才,加以培养,必成企业栋梁,而且这样选拔的人才与企业的契合度.忠诚度方面都相对较高. ...
- elasticSearch+spring 整合 maven依赖详解
摘自:http://www.mayou18.com/detail/nTxPQSyu.html [Elasticsearch基础]elasticSearch+spring 整合 maven依赖详解 Ma ...
- Python实现批量新建SecureCRT Session
最近因为工作需要,我需要在ssh的时候保存几千台网关的session,工作量相当大(也就是ssh的时候需要记住用户名和密码,然后还要再session选项中录入enable密码,相当繁琐),而且设备的用 ...
- python 工具安装
1. whl文件的安装:pip install 文件名.whl 2. 压缩包中有setup.py的安装:python setup.py install 3. 利用anaconda下载安装:conda ...
- TestNG 自动化测试入门教程--典型示例
TestNG介绍 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 功能都差不多, 只是功能更加强大,使用也更方便 Java中已经有一个JUnit的测试框架了. Tes ...
- 利用 ssh 的用户配置文件 config 管理 ssh 会话
http://dhq.me/use-ssh-config-manage-ssh-session 利用 ssh 连接远程服务器,一般都要输入以下类似命令: 1 ssh user@hostname -p ...
- 简书markdown教程
1 支持 Markdown 的编辑器 Windows 推荐 Sublime Text 3,强大优雅的编辑器.MarkdownPad,一款可以直接预览排版效果的编辑器. Mac 推荐 Ulysess,专 ...
- sql复杂案例
工作中往往会遇到非常棘手的数据查询,运营人员不知道你的数据库表是如何设计的,也不知道你的数据库记录了啥数据,他只知道自己需要看什么数据,甚至有些数据根本就不存在. 单表查询的难度: 一张数据库的表ta ...