定义
- 定义:将一个复杂对象的构建与它的表示分离 使得同样的构建过程 可以创建不同的表示
- 类型 创建型
- 用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
适用场景
1.如果一个对象有非常复杂的内部结构 很多属性
2.想把复杂对象的创建和使用分离
1.封装性好 创建和使用分离
2.扩展性好、建造类之间独立 一定程度上解耦
1.产生多余的builder 对象
2.产品内部发生变化 建造者都需要进行修改 成本较大
1.建造者 注重方法调用顺序 可以创建一些复杂的产品 由各种复杂的组件组成
2。工厂模式 注重创建产品 创建出来的都是一个样子
创建对象粒度不同
3.关注点
工厂模式 创建出来就ok 工厂不关心顺序
建造者 不当指创建出来 还要知道这些产品是那些组件组成的 关心顺序
1.0 创建课程
package com.zw.design.pattern.creational.builder;
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
//question and answer
private String courseOA;
@Override
public String toString() {
return "Course{" +
"courseName='" + courseName + ''' +
", coursePPT='" + coursePPT + ''' +
", courseVideo='" + courseVideo + ''' +
", courseArticle='" + courseArticle + ''' +
", courseOA='" + courseOA + ''' +
'}';
}
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 getCourseVideo() {
return courseVideo;
}
public void setCourseVideo(String courseVideo) {
this.courseVideo = courseVideo;
}
public String getCourseArticle() {
return courseArticle;
}
public void setCourseArticle(String courseArticle) {
this.courseArticle = courseArticle;
}
public String getCourseOA() {
return courseOA;
}
public void setCourseOA(String courseOA) {
this.courseOA = courseOA;
}
}
2.0 该类实现真正的课程类
package com.zw.design.pattern.creational.builder;
public class CourseActualBuilder extends CourseBuilder {
private Course course=new Course();
@Override
public void buildCourseName(String courseName) {
course.setCourseName(courseName);
}
@Override
public void buildCoursePPT(String coursePPT) {
course.setCoursePPT(coursePPT);
}
@Override
public void buildCourseVideo(String courseVideo) {
course.setCourseVideo(courseVideo);
}
@Override
public void buildCourseArticle(String courseArticle) {
course.setCourseArticle(courseArticle);
}
@Override
public void buildCourseOA(String courseOA) {
course.setCourseOA(courseOA);
}
@Override
public Course buildCourse() {
return course;
}
}
3.0 写一个 课程的建造者类
package com.zw.design.pattern.creational.builder;
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);
//question and answer
public abstract void buildCourseOA(String courseOA);
public abstract Course buildCourse();
}
4.0 写一个 教练类
package com.zw.design.pattern.creational.builder;
public class Coach {
private CourseBuilder courseBuilder;
public void setCourseBuilder(CourseBuilder courseBuilder) {
this.courseBuilder = courseBuilder;
}
public Course getCourse( String courseName,
String coursePPT,
String courseVideo,
String courseArticle,
//question and answer
String courseOA){
this.courseBuilder.buildCourseName(courseName);
this.courseBuilder.buildCourseOA(courseOA);
this.courseBuilder.buildCourseArticle(courseArticle);
this.courseBuilder.buildCoursePPT(coursePPT);
this.courseBuilder.buildCourseVideo(courseVideo);
return this.courseBuilder.buildCourse();
}
}
5.0 测试类
package com.zw.design.pattern.creational.builder;
public class Test {
public static void main(String[] args) {
CourseActualBuilder cab=new CourseActualBuilder();
Coach zw=new Coach();
zw.setCourseBuilder(cab);
Course course = zw.getCourse("spring源码解析", "spring源码解析PPT",
"spring源码解析视频", "spring源码解析手记", "spring源码解析问答");
System.out.println("course = " + course);
}
}
测试结果
uml 图 如图所示
代码如下
代码里面v2 是建造者 内部类的模式
比如 jdk 经典之作StringBuilder 使用了建造者模式 比如append()方法 还有ImmutableSet.builder().add()方法也是建造者模式
比如经典之作 mybatis 当中这个类 SqlSessionFactoryBuilder 也使用建造者模式



