涉及模式讲究的是一个平衡和业务模型的匹配。
定义
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
特征:用户只需指定需要构建的类型就可以得到他们,建造过程及细节不需要知道
类型:创建型
适用场景
- 如果一个对象有非常复杂的内部结构(很多属性)
-
优点
封装性好,创建和使用分离
-
缺点
产生多余的Builder对象
-
Coding
Course
public class Course {private String courseName;private String coursePPT;private String courseVideo;private String courseArticle;//question & answerprivate 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;}@Overridepublic String toString() {return "Course{" +"courseName='" + courseName + '\'' +", coursePPT='" + coursePPT + '\'' +", courseVideo='" + courseVideo + '\'' +", courseArticle='" + courseArticle + '\'' +", courseQA='" + courseQA + '\'' +'}';}}
CourseBuilder
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();}
CourseActualBuilder ```java public class CourseActualBuilder extends CourseBuilder {
private Course course = new Course();
@Overridepublic void buildCourseName(String courseName) {course.setCourseName(courseName);}@Overridepublic void buildCoursePPT(String coursePPT) {course.setCoursePPT(coursePPT);}@Overridepublic void buildCourseVideo(String courseVideo) {course.setCourseVideo(courseVideo);}@Overridepublic void buildCourseArticle(String courseArticle) {course.setCourseArticle(courseArticle);}@Overridepublic void buildCourseQA(String courseQA) {course.setCourseQA(courseQA);}@Overridepublic Course makeCourse() {return course;}
}
Coach```javapublic 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){this.courseBuilder.buildCourseName(courseName);this.courseBuilder.buildCoursePPT(coursePPT);this.courseBuilder.buildCourseVideo(courseVideo);this.courseBuilder.buildCourseArticle(courseArticle);this.courseBuilder.buildCourseQA(courseQA);return this.courseBuilder.makeCourse();}}
Test
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设计模式精讲","Java设计模式精讲PPT","Java设计模式精讲视频","Java设计模式精讲手记","Java设计模式精讲问答");System.out.println(course);}}
V2
public class Course {private String courseName;private String coursePPT;private String courseVideo;private String courseArticle;//question & answerprivate 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;}@Overridepublic 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 & answerprivate 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);}}}
Test
public class Test {public static void main(String[] args) {// 链式调用Course course = new Course.CourseBuilder().buildCourseName("Java设计模式精讲").buildCoursePPT("Java设计模式精讲PPT").buildCourseVideo("Java设计模式精讲视频").build();System.out.println(course);}}
典型用例
StringBuilderStringBuffer
