一、建造者的定义与类型
》定义:将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式就是一步步创建一个包含多个组件的对象,相同的构建过程可以创建不同的产品,比较适用于流程固定,建造过程不同的产品。
》用于只需要指定需要创建的类型就可以得到它们,建造过程及细节不需要
简单说,比如做菜,每个创建者创建的顺序可以不同,但各个组件一定是要加入的,最终创建一盘菜。 对应于后面代码中会有调用方法的顺序可以比较随意的点
》类型;创建型。
二、建造者的适用场景。
》如果一个对象有非常复杂的内部结构(类有很多属性)
》想把复杂对象的创建和使用分离
三、建造者优点
》封装性好,创建和使用分离
》扩展性好、建造者类之间独立、一定程度上解耦。
四、建造者缺点。
》产生多余的builder对象。
》产品内部发生变化,建造者都要修改,维护成本大。
五、建造者模式和工厂类相关的模式的差异:
》工厂者模式更注重于创造产品,建造者模式更关注于方法的调用顺序;
》创建对象的力度不同。建造者模式可以创建较为复杂的产品,由各种复杂的组件组成,而工厂模式创建出来的产品都是一个样子。
》工厂模式只是关注创建创造出来即可(只要有一个符合基本要求的产品即可,比如想要一个椅子,但不关心材质,目标只需要一个椅子),而建造者模式不仅关心创造出产品,还关注产品创建的细节,有哪些组件组成。可能因为细节的不同,创建出不一样的产品(比如会关注创造的是什么材质的椅子)。
》当创建一个对象需要复杂的过程时适合建造者模式,而创建一个对象只需要简单的方法时工厂类模式即可。
六、业务场景与代码实例:
》场景:假设慕课网上有专门的课程课程教练(coatch)负责和某个提供课程的公司的讲师进行对接。讲师负责提供课程相应的材料,而讲师的老总负责指挥。
》代码:
package com.zxl.design.pattern.creational.builder;
/**
* Created by Administrator on 2019/5/26.
*/
public class Course {
private String courseName;
private String coursePPT;
private String courseArtical;
private String courseVideo;
private String courseQA;
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCoursePPT() {
return coursePPT;
}
public void setCoursePPT(String coursePPT) {
this.coursePPT = coursePPT;
}
public String getCourseArtical() {
return courseArtical;
}
public void setCourseArtical(String courseArtical) {
this.courseArtical = courseArtical;
}
public String getCourseVideo() {
return courseVideo;
}
public void setCourseVideo(String courseVideo) {
this.courseVideo = courseVideo;
}
public String getCourseQA() {
return courseQA;
}
public void setCourseQA(String courseQA) {
this.courseQA = courseQA;
}
@Override
public String toString() {
return "Course{" +
"courseName='" + courseName + '\'' +
", coursePPT='" + coursePPT + '\'' +
", courseArtical='" + courseArtical + '\'' +
", courseVideo='" + courseVideo + '\'' +
", courseQA='" + courseQA + '\'' +
'}';
}
}
package com.zxl.design.pattern.creational.builder;
/**
* Created by Administrator on 2019/5/26.
*/
public abstract class CourseBuilder {
private String courseName;
private String coursePPT;
private String courseArtical;
private String courseVideo;
private String courseQA;
public abstract void buildCourseName(String courseName);
public abstract void buildCoursePPT(String coursePPT);
public abstract void buildCourseArtical(String courseArtical);
public abstract void buildCourseVideo(String courseVideo);
public abstract void buildCourseQA(String courseQA);
public abstract Course makeCourse();
}
package com.zxl.design.pattern.creational.builder;
/**
* Created by Administrator on 2019/5/26.
*/
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 buildCourseArtical(String courseArtical) {
course.setCourseArtical(courseArtical);
}
public void buildCourseVideo(String courseVideo) {
course.setCourseVideo(courseVideo);
}
public void buildCourseQA(String courseQA) {
course.setCourseQA(courseQA);
}
public Course makeCourse() {
return course;
}
}
package com.zxl.design.pattern.creational.builder;
/**
* Created by Administrator on 2019/5/26.
*/
public class Coatch {
private CourseBuilder courseBuilder;
public void setCourseBuilder(CourseBuilder courseBuilder) {
this.courseBuilder = courseBuilder;
}
public Course makeCourse(String courseName, String coursePPT,
String courseArtical, String courseVideo,
String courseQA) {
this.courseBuilder.buildCourseName(courseName);
this.courseBuilder.buildCourseQA(courseQA);
this.courseBuilder.buildCourseVideo(courseVideo);
this.courseBuilder.buildCourseArtical(courseArtical);
this.courseBuilder.buildCoursePPT(coursePPT);
return this.courseBuilder.makeCourse();
}
}
package com.zxl.design.pattern.creational.builder;
/**
* Created by Administrator on 2019/5/26.
*/
public class Test {
public static void main(String[] args) {
CourseBuilder courseBuilder =new CourseActualBuilder();
Coatch coatch = new Coatch();
coatch.setCourseBuilder(courseBuilder);
Course course =coatch.makeCourse("java 建造者模式","java 建造者模式PPT",
"java 建造者模式手记","java 建造者模式视频",
"java 建造者模式问答");
System.out.println(course);
}
}
初级版本:
建造者模式之升级版本:这也是比较常见的使用方式,可以进行链式调用,这也是建造者模式的一大特点。
该方式在进行设置属性时比较明确,尤其当属性多时,不容易产生参数因为顺序设置错误等原因造成错误。代码如下:
package com.zxl.design.pattern.creational.builder.buildv2;
/**
* Created by Administrator on 2019/5/26.
*/
public class Course {
private String courseName;
private String coursePPT;
private String courseArtical;
private String courseVideo;
private String courseQA;
public Course(CourseBuilder courseBuilder){
this.courseName = courseBuilder.courseName;
this.coursePPT = courseBuilder.coursePPT;
this.courseArtical = courseBuilder.courseArtical;
this.courseVideo = courseBuilder.courseVideo;
this.courseQA =courseBuilder.courseQA;
}
public String getCourseName() {
return courseName;
}
public void setCourseName(String courseName) {
this.courseName = courseName;
}
public String getCoursePPT() {
return coursePPT;
}
public void setCoursePPT(String coursePPT) {
this.coursePPT = coursePPT;
}
public String getCourseArtical() {
return courseArtical;
}
public void setCourseArtical(String courseArtical) {
this.courseArtical = courseArtical;
}
public String getCourseVideo() {
return courseVideo;
}
public void setCourseVideo(String courseVideo) {
this.courseVideo = courseVideo;
}
public String getCourseQA() {
return courseQA;
}
public void setCourseQA(String courseQA) {
this.courseQA = courseQA;
}
@Override
public String toString() {
return "Course{" +
"courseName='" + courseName + '\'' +
", coursePPT='" + coursePPT + '\'' +
", courseArtical='" + courseArtical + '\'' +
", courseVideo='" + courseVideo + '\'' +
", courseQA='" + courseQA + '\'' +
'}';
}
public static class CourseBuilder{
private String courseName;
private String coursePPT;
private String courseArtical;
private String courseVideo;
private String courseQA;
public CourseBuilder builderCourseName(String courseName){
this.courseName = courseName;
return this;
}
public CourseBuilder builderCoursePPT(String coursePPT){
this.coursePPT = coursePPT;
return this;
}
public CourseBuilder builderCourseArtical(String courseArtical){
this.courseArtical = courseArtical;
return this;
}
public CourseBuilder builderCourseVideo(String courseVideo){
this.courseVideo = courseVideo;
return this;
}
public CourseBuilder builderCourseQA(String courseQA){
this.courseQA = courseQA;
return this;
}
public Course builde(){
return new Course(this);
}
}
}
package com.zxl.design.pattern.creational.builder.buildv2;
import java.net.SocketPermission;
/**
* Created by Administrator on 2019/5/26.
*/
public class Test {
public static void main(String[] args) {
Course course = new Course.CourseBuilder().builderCourseName("java建造者模式v2")
.builderCoursePPT("java建造者模式v2 PPT")
.builderCourseArtical("java建造者模式v2手记")
.builderCourseVideo("java建造者模式v2视频")
.builderCourseQA("java建造者模式v2问答")
.builde();
System.out.println(course);
}
}