java设计模式——建造者模式
一. 定义与类型
定义:将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示
用户只需制定需要建造的类型就可以得到它们,建造过程以及细节不需要知道
类型:创建型
建造者模式与工厂模式比较相近,它们的区别在于,
建造者模式注重方法的调用顺序,工厂模式注重创建产品
它们的创建力度不同,建造者模式可以创建较为复杂产品,有各种复杂的部件,而工厂模式创建出来的产品都是一个样子
工厂模式关注的只要把这个产品创建出来就行了,建造者模式不仅要把产品创建出来,还要知道这个产品有哪些部件组成
二. 适用场景
如果一个对象有非常复杂的内部结构(很多熟悉),想把复杂对象的创建和使用分离
三. 优缺点
优点:
封装性好,创建和使用分离
扩展性好,建造类之间独立,一定程度上解耦
缺点:
产生多余的Builder对象
产品内部发生变化,建造者都要修改,成本较大
四. Coding
创建一个抽象的课程建造类:
/**
* @program: designModel
* @description:
* @author: YuKai Fan
* @create: 2018-12-03 16:48
**/
public abstract class CourseBuilder { public abstract void buildCourseName(String courseName);
public abstract void buildCoursePPT(String coursePPT);
public abstract void buildCourseVideo(String courseVideo);
public abstract void buildCourseArticle(String courseArticle);
public abstract void buildCourseQA(String courseQA); //上面的都属于课程的组件,这个方法时课程的建造
public abstract Course makeCourse();
}
创建一个实际的建造类:
/**
* @program: designModel
* @description:
* @author: YuKai Fan
* @create: 2018-12-03 16:50
**/
public class CourseActualBuilder extends CourseBuilder{
private Course course = new Course(); public void buildCourseName(String courseName) {
course.setCourseName(courseName);
} public void buildCoursePPT(String coursePPT) {
course.setCoursePPT(coursePPT);
} public void buildCourseVideo(String courseVideo) {
course.setCourseVideo(courseVideo);
} public void buildCourseArticle(String courseArticle) {
course.setCourseArticle(courseArticle);
} public void buildCourseQA(String courseQA) {
course.setCourseQA(courseQA);
} public Course makeCourse() {
return course;
}
}
创建建造者实体类:
/**
* @program: designModel
* @description:
* @author: YuKai Fan
* @create: 2018-12-03 16:52
**/
public class Coach {
private CourseBuilder courseBuilder; //通过set注入,传入的课程建造的值
public void setCourseBuilder(CourseBuilder courseBuilder) {
this.courseBuilder = courseBuilder;
} //课程建造方法
public Course makeCourse(String courseName,
String coursePPT,
String courseVideo,
String courseArticle,
String courseQA) {
this.courseBuilder.buildCourseName(courseName);
this.courseBuilder.buildCoursePPT(coursePPT);
this.courseBuilder.buildCourseArticle(courseArticle);
this.courseBuilder.buildCourseVideo(courseVideo);
this.courseBuilder.buildCourseQA(courseQA);
return this.courseBuilder.makeCourse();
}
}
应用层:
/**
* @program: designModel
* @description:
* @author: YuKai Fan
* @create: 2018-12-03 16:56
**/
public class Test {
public static void main(String[] args) {
CourseBuilder courseBuilder = new CourseActualBuilder();
Coach coach = new Coach();
coach.setCourseBuilder(courseBuilder); Course course = coach.makeCourse("Java设计模式",
"Java设计模式PPT",
"Java设计模式视频",
"Java设计模式手记",
"Java设计模式问答"); System.out.println(course);
}
}
UML类图:

从上方的UML类图与coding可以看出,建造者模式,将课程的表示与建造分离开了,test只需要传入相应的课程类型就可以创建课程。
test与抽象的课程建造类,课程类都没有关系,但是与coach指挥官有关,创建指挥管通过组合的方式使用coursebuilder这个抽象类,拿到具体的课程类。
可以有很多的builder比如,前端builder和后端builder,test可以选择不同的builder,传到对应的coach,然后coach通过拿到不同的builder来创建不同的课程,也就是说,把这个注入的职责交给应用层。
还有一种,如果只有一个后端课程,没有其他课程。那就可以把,后端的课程的builder默认注入到后端课程coach中,应用层不需要与courseActualBuilder有交互了,只和具体的coach有关。
建造者升级(演进),这个coach完全可以不需要,也就是链式调用
建造者模式V2:使用静态内部类,把具体的实体类与具体的builder类,创建在一个类中
/**
* @program: designModel
* @description:
* @author: YuKai Fan
* @create: 2018-12-03 17:02
**/
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle; //question & answer
private String courseQA; public Course(CourseBuilder courseBuilder) {
this.courseName = courseBuilder.courseName;
this.coursePPT = courseBuilder.coursePPT;
this.courseVideo = courseBuilder.courseVideo;
this.courseArticle = courseBuilder.courseArticle;
this.courseQA = courseBuilder.courseQA;
} //内部类
public static class CourseBuilder{
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle; //question & answer
private String courseQA; public CourseBuilder buildCourseName(String courseName){
this.courseName = courseName;
return this;
}
public CourseBuilder buildCoursePPT(String coursePPT) {
this.coursePPT = coursePPT;
return this;
} public CourseBuilder buildCourseVideo(String courseVideo) {
this.courseVideo = courseVideo;
return this;
} public CourseBuilder buildCourseArticle(String courseArticle) {
this.courseArticle = courseArticle;
return this;
} public CourseBuilder buildCourseQA(String courseQA) {
this.courseQA = courseQA;
return this;
} public Course build() {
return new Course(this);
}
} @Override
public String toString() {
return "Course{" +
"courseName='" + courseName + '\'' +
", coursePPT='" + coursePPT + '\'' +
", courseVideo='" + courseVideo + '\'' +
", courseArticle='" + courseArticle + '\'' +
", courseQA='" + courseQA + '\'' +
'}';
}
}
test:
/**
* @program: designModel
* @description:
* @author: YuKai Fan
* @create: 2018-12-03 17:08
**/
public class Test {
public static void main(String[] args) {
Course course= new Course.CourseBuilder().buildCourseName("Java设计模式").buildCoursePPT("Java设计模式PPT").buildCourseVideo("Java设计模式视频").buildCourseQA("Java设计模式问答").build();
System.out.println(course);
}
}
UML类图:

这种方式,在实际应用当中用的比较多,以后的维护都会比较方便。
无论那种方式,建造者模式,将产品的构造,组件都分离开。从上面的例子可以看出,course的创建(具体过程),启动course的创建(coach来创建),创建哪种course(test应用层)都分的清清楚楚,即模块化,达到了模块分离的效果。这样维护和扩展都很方便
五. 源码分析
使用最多最常用的StringBuilder,StringBuffer它们的append方法。就是使用了建造者模式,也是使用的链式调用.
CacheBuilder方法,也是典型的建造者模式
Spring中的BeanDefinitionBuilder,Mybatis中的SqlSessionFactoryBuilder
java设计模式——建造者模式的更多相关文章
- 3.java设计模式-建造者模式
Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...
- 我的Java设计模式-建造者模式
在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...
- Java设计模式-建造者模式(Builder)
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指 ...
- Java设计模式——建造者模式(创建型模式)
概述 建造者模式也称为生成器模式,是一种对象创建型模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 建造者模式意在为重叠构造 ...
- Java设计模式--------建造者模式(Builder模式)
Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构 ...
- java设计模式------建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图 描述 Builder:定义一个建造者抽象类,以规范产品对象的各个组成部分的建造.这个接口 ...
- Java设计模式—建造者模式
建造模式: 将一个复杂的对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的. 建造模式表示是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内 ...
- 设计模式—建造者模式(Builder)
title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...
- Java设计模式——组合模式
JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...
随机推荐
- 手写的select 下拉菜单
我们在进行表单设计时,可能要用到select下拉选项控件,遗憾的是,IE浏览器默认的select控件外观非常丑陋,而且不能用样式来控制,不能在选项中添加图片等信息.今天我将通过实例来讲解如何用CSS和 ...
- POJ1033 Defragment
题目来源:http://poj.org/problem?id=1033 题目大意: 某操作系统的文件系统中,所有的磁盘空间被分为N个大小相等的cluster,编号1至N.每个文件占用一个或多个clus ...
- JS键盘事件之键控Div
自上次做的鼠标拖动Div之后,看到fgm.cc的例子,发现用键盘操控Div貌似也是十分有趣,这些DOM操作随着jquery的没落,虽然渐渐少用了,不过有些DOM操作还是必不可少的.现在是虽然数据为王( ...
- 新手常见Python运行时错误
经过整理与在实际中遇到的问题,将新手经常遇到的汇总下,以便自己犯傻又这么干了 1)"SyntaxError :invalid syntax",语法错误 A.查看是否在 if , e ...
- 02------css选择器
css的选择器:1.基本选择器 2.高级选择器 基本选择器包含: 1.标签选择器标签选择器可以选中所有的标签元素,比如div,ul,li ,p等等,不管标签藏的多深,都能选中,选中的是所有的,而不是某 ...
- 10g duplicate and 11g dupliacte db for standby
###################10g Creating a Physical Standby Database OASSTBY Make sure database is in archive ...
- Siverlight5 3D 中文环境搭建
一.测试环境 vs2010旗舰版 win7 64位旗舰版 二.必备工具 1.vs2010 旗舰版 2.vs2010 sp1 补丁 3.silverlight5 tools 也可以去silverligh ...
- (转)Linux 命令(40): wc 命令
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 原文:http://blog.jobbole.com/109925/ http:/ ...
- Unity在Project视图里面显示文件的拓展名
Unity在Project视图里面显示文件的拓展名 功能脚本如下: using System.IO; using System.Reflection; using UnityEngine; using ...
- 【Unity3D】简要分析unity3d中剪不断理还乱的yield
在学习unity3d的时候很容易看到下面这个例子: void Start () { StartCoroutine(Destroy()); } IEnumerator Destroy(){ yield ...