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)