一. 定义与类型

定义:将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示

用户只需制定需要建造的类型就可以得到它们,建造过程以及细节不需要知道

类型:创建型

建造者模式与工厂模式比较相近,它们的区别在于,

建造者模式注重方法的调用顺序,工厂模式注重创建产品

它们的创建力度不同,建造者模式可以创建较为复杂产品,有各种复杂的部件,而工厂模式创建出来的产品都是一个样子

工厂模式关注的只要把这个产品创建出来就行了,建造者模式不仅要把产品创建出来,还要知道这个产品有哪些部件组成

二. 适用场景

如果一个对象有非常复杂的内部结构(很多熟悉),想把复杂对象的创建和使用分离

三. 优缺点

优点:

封装性好,创建和使用分离

扩展性好,建造类之间独立,一定程度上解耦

缺点:

产生多余的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设计模式——建造者模式的更多相关文章

  1. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  2. 我的Java设计模式-建造者模式

    在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...

  3. Java设计模式-建造者模式(Builder)

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指 ...

  4. Java设计模式——建造者模式(创建型模式)

    概述   建造者模式也称为生成器模式,是一种对象创建型模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象.   建造者模式意在为重叠构造 ...

  5. Java设计模式--------建造者模式(Builder模式)

    Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构 ...

  6. java设计模式------建造者模式

    建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图 描述 Builder:定义一个建造者抽象类,以规范产品对象的各个组成部分的建造.这个接口 ...

  7. Java设计模式—建造者模式

    建造模式:        将一个复杂的对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的. 建造模式表示是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内 ...

  8. 设计模式—建造者模式(Builder)

    title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...

  9. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

随机推荐

  1. I/O重定向和管道

    一:I/O设备 I/O(Input/Output),即输入/输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出. 标准输入(STDIN):0 默认接受来自键盘的输入 标准输出(ST ...

  2. thinkphp5.1常量定义使用

    thinkphp5.1取消了系统常量 可以把常量配置在app.php文件中 //配置网站地址 'WEB_URL'=>'http://127.0.0.1/tp5', 可以使用config()函数直 ...

  3. Windows平台Anaconda使用笔记

    1.官网下载anaconda安装. 2.将命令行工具路径加入系统环境变量 C:\ProgramData\Anaconda3\ScriptsC:\ProgramData\Anaconda3\Librar ...

  4. IOS 关于tableview中cell的长按手势

    说明:虽然是tableview中cell的长按手势  但是手势是添加在tableview上的 UILongPressGestureRecognizer *longpress = [[UILongPre ...

  5. JS精粹知识点和我的解释

    函数若是不return则默认返回undefined const value=()=>{ let a=3; } let value_test; console.log(value(),value_ ...

  6. 惠普台式机UEFI BIOS设置U盘启动

    开机按F9进入选中安装u盘启动软件的u盘,即可进入u盘启动选项,将于U盘安装系统操作一致 如:F9未找到U盘,可进行如下操作 1.开机时点击F10键进入BIOS更改选项:  更改 Advanced-- ...

  7. 练习十三:水仙花数,用for循环实现

    水仙花数是指一个n位正整数(n>=3),他得每个位上得数字得n次幂之和等于它本身(例如:1^3+5^3+3^3=153) for i in range(101,1000): #3位数得水仙花数 ...

  8. JavaScript跨域资源请求(CORS)解决方案

    跨域:当协议.主域名.子域名.端口号中任意一个不相同时都不算同一个域,而在不同域之间请求数据即为跨域请求.解决方法有以下几种(如有错误欢迎指出)以请求图片url为例: 1.通过XMLHttpReque ...

  9. UVALive - 6442

    题目链接:https://vjudge.net/contest/241341#problem/I 题目大意:输入t,t组样例,输入n,m,有n个圆槽,m个硬币,接下来m行代表每个硬币所在的位子,要求你 ...

  10. (转)Linux 开机引导和启动过程详解

    Linux 开机引导和启动过程详解 编译自:https://opensource.com/article/17/2/linux-boot-and-startup作者: David Both 原创:LC ...