定义与类型
定义:将一个复杂对象的构建和它的表示分离,使同样的构建过程可以表示创建不同的表示
用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
类型:创建型
适用场景
- 如果一个对象有非常复杂的内部结构(很多的属性)
- 想把复杂对象的创建和使用分离
优点
- 封装性好,创建和使用分离
- 扩展性好、建造类之间独立、一定程度上解耦
缺点
- 产生多余的builder对象
- 产品内部发生变化,建造者都要修改,成本较大
Coding
和工厂模式区别:建造者模式注重于方法的调用顺序,工厂模式注重于创建产品
建造者可以创建出复杂的商品,工厂创建出来的都是一个样,工厂模式注重只要把这个对象创建出来就ok了,建造者不仅要创建出这个产品,还要知道这个产品由那些部件组成
package com.jpg.creational.builder.v2;
//对于一个课程来说,由各种属性组成,比如:课程名称、PPT、视频、手记
//对于这种属性比较多的可以用建造者模式
public class Course {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
private String courseQA;
public Course(CourseBuilder courseBuilder) {
this.courseName = courseBuilder.courseName;
this.coursePPT = courseBuilder.coursePPT;
this.courseVideo = courseBuilder.courseVideo;
this.courseArticle = courseBuilder.courseArticle;
}
@Override
public String toString() {
return "Courser [courseName=" + courseName + ", coursePPT=" + coursePPT + ", courseVideo=" + courseVideo
+ ", courseArticle=" + courseArticle + ", courseQA=" + courseQA + "]";
}
public static class CourseBuilder {
private String courseName;
private String coursePPT;
private String courseVideo;
private String courseArticle;
private String courseQA;
public CourseBuilder buildCourseName(String courseName) {
this.courseName = courseName;
return this;
}
public CourseBuilder buildCoursePPT(String coursePPT) {
this.courseName = coursePPT;
return this;
}
public CourseBuilder buildCourseVideo(String courseVideo) {
this.courseName = courseVideo;
return this;
}
public CourseBuilder buildCourseArticle(String courseArticle) {
this.courseName = courseArticle;
return this;
}
public CourseBuilder buildCourseQA(String courseQA) {
this.courseName = courseQA;
return this;
}
public Course build() {
return new Course(this);
}
}
~~--------------------------~~
package com.jpg.creational.builder.v2;
public class Test {
public static void main(String[] args) {
Course course = new Course.CourseBuilder().buildCourseName("Java设计模式课程").buildCoursePPT("Java设计模式PPT").buildCourseVideo("Java设计模式视频").buildCourseQA("Java设计模式QA").build();
System.out.println(course);
}
}
}
JDK源码解析
StringBuilder就是使用了建造者模式