Builder mode

  • Definition: To separate the construction of a complex object from its representation so that the same construction process can create different representations
  • Users only need to specify the type to be built to get them, the construction process and details do not need to know
  • Type: Create type
  • Applicable scenario:

    • If an object has a very complex internal structure (lots of properties)
    • You want to separate the creation and use of complex objects
  • Advantages:

    • Good encapsulation, separation of creation and use
    • Good expansibility, independent between building classes, decoupling to a certain extent
  • Disadvantages:

    • Generates redundant Builder objects
    • Product internal changes, the builder has to modify, the cost is large
Code sample

Version 1:

public class Course { private String courseName; private String coursePPT; private String courseVideo; private String courseArticle; // question&Answer 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 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 getCourseQA() { return courseQA; } public void setCourseQA(String courseQA) { this.courseQA = courseQA; } @Override public String toString() { return "Course{" + "courseName='" + courseName + '\'' + ", coursePPT='" + coursePPT + '\'' + ", courseVideo='" + courseVideo + '\'' + ", courseArticle='" + courseArticle + '\'' + ", courseQA='" + courseQA + '\'' + '}'; }}
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();
}
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 buildCourseQA(String courseQA) { course.setCourseQA(courseQA); } @Override public Course makeCourse() { return course; }}
public class Coach { private CourseBuilder courseBuilder; public void setCourseBuilder(CourseBuilder courseBuilder) { this.courseBuilder = courseBuilder; } public Course makeCourse(String courseName,String coursePPT, String courseVideo,String courseArticle, String courseQA){ courseBuilder.buildCourseName(courseName); courseBuilder.buildCoursePPT(coursePPT); courseBuilder.buildCourseVideo(courseVideo); courseBuilder.buildCourseArticle(courseArticle); courseBuilder.buildCourseQA(courseQA); return courseBuilder.makeCourse(); }}

The test class:

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 Design Pattern ","Java Design Pattern PPT","Java Design Pattern Video ","Java Design Pattern Notes ","Java Design Pattern Questions and Answers "); System.out.println(course); }}

Version 2:

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; } @Override public String toString() { return "Course{" + "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; // 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); }}}

The test class:

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 Design Pattern ","Java Design Pattern PPT","Java Design Pattern Video ","Java Design Pattern Notes ","Java Design Pattern Questions and Answers "); System.out.println(course); }}
Application scenarios

The JDK:

  • StringBuilder (thread unsafe)
  • StringBuffer (thread-safe)
  • Guava (CacheBuilder)
  • Spring (BeanDefinitionBuilder)
  • MyBatis (SQLSessionFactoryBuilder)