建造者模式
1.定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道。
2.类型:创建型
3.适用场景:如果一个对象有非常复杂的内部结构(很多属性);想把复杂对象的创建和使用分离。
4.优点:封装性好,创建和使用分离;扩展性好、建造类之间独立、一定程度上解耦。
5.缺点:产生多余的Builder对象;产品内部发生变化,建造者都要修改,成本较大
6.实例目录package
7.实例UML类图
内部类
8.代码
1 package com.geely.design.pattern.creational.builder; 2 3 public class Course { 4 private String courseName; 5 private String coursePPT; 6 private String courseVideo; 7 private String courseArticle; 8 private String courseQA; 9 10 public String getCourseName() { 11 return courseName; 12 } 13 14 public void setCourseName(String courseName) { 15 this.courseName = courseName; 16 } 17 18 public String getCoursePPT() { 19 return coursePPT; 20 } 21 22 public void setCoursePPT(String coursePPT) { 23 this.coursePPT = coursePPT; 24 } 25 26 public String getCourseVideo() { 27 return courseVideo; 28 } 29 30 public void setCourseVideo(String courseVideo) { 31 this.courseVideo = courseVideo; 32 } 33 34 public String getCourseArticle() { 35 return courseArticle; 36 } 37 38 public void setCourseArticle(String courseArticle) { 39 this.courseArticle = courseArticle; 40 } 41 42 public String getCourseQA() { 43 return courseQA; 44 } 45 46 public void setCourseQA(String courseQA) { 47 this.courseQA = courseQA; 48 } 49 50 @Override 51 public String toString() { 52 return "Course{" + 53 "courseName='" + courseName + '\'' + 54 ", coursePPT='" + coursePPT + '\'' + 55 ", courseVideo='" + courseVideo + '\'' + 56 ", courseArticle='" + courseArticle + '\'' + 57 ", courseQA='" + courseQA + '\'' + 58 '}'; 59 } 60 }
1 package com.geely.design.pattern.creational.builder; 2 3 public abstract class CourseBuilder { 4 5 public abstract void builderCourseName(String courseName); 6 public abstract void builderCoursePPT(String coursePPT); 7 public abstract void builderCourseVideo(String courseVideo); 8 public abstract void builderCourseArticle(String courseArticle); 9 public abstract void builderCourseQA(String courseQA); 10 11 public abstract Course makeCourse(); 12 }
1 package com.geely.design.pattern.creational.builder; 2 3 public class CourseActualBuilder extends CourseBuilder{ 4 private Course course = new Course(); 5 @Override 6 public void builderCourseName(String courseName) { 7 course.setCourseName(courseName); 8 } 9 10 @Override 11 public void builderCoursePPT(String coursePPT) { 12 course.setCoursePPT(coursePPT); 13 } 14 15 @Override 16 public void builderCourseVideo(String courseVideo) { 17 course.setCourseVideo(courseVideo); 18 } 19 20 @Override 21 public void builderCourseArticle(String courseArticle) { 22 course.setCourseArticle(courseArticle); 23 } 24 25 @Override 26 public void builderCourseQA(String courseQA) { 27 course.setCourseQA(courseQA); 28 } 29 30 @Override 31 public Course makeCourse() { 32 return course; 33 } 34 }
1 package com.geely.design.pattern.creational.builder; 2 3 public class Coach { 4 private CourseBuilder courseBuilder; 5 public void setCourseBuilder(CourseBuilder courseBuilder){ 6 this.courseBuilder = courseBuilder; 7 } 8 9 public Course makeCourse(String courseName,String coursePPT, 10 String courseVideo,String courseArticle, 11 String courseQA){ 12 this.courseBuilder.builderCourseArticle(courseArticle); 13 this.courseBuilder.builderCourseName(courseName); 14 this.courseBuilder.builderCoursePPT(coursePPT); 15 this.courseBuilder.builderCourseVideo(courseVideo); 16 this.courseBuilder.builderCourseQA(courseQA); 17 return this.courseBuilder.makeCourse(); 18 } 19 }
1 package com.geely.design.pattern.creational.builder; 2 3 public class Test { 4 public static void main(String[] args) { 5 CourseBuilder courseBuilder = new CourseActualBuilder(); 6 Coach coach = new Coach(); 7 coach.setCourseBuilder(courseBuilder); 8 Course course = coach.makeCourse( 9 "JAVA设计模式精讲", 10 "JAVA设计模式精讲PPT", 11 "JAVA设计模式精讲视频", 12 "JAVA设计模式精讲手记", 13 "JAVA设计模式精讲问答"); 14 System.out.println(course); 15 } 16 }
内部类
1 package com.geely.design.pattern.creational.builder.v2; 2 3 public class Course { 4 private String courseName; 5 private String coursePPT; 6 private String courseVideo; 7 private String courseArticle; 8 private String courseQA; 9 10 public Course(CourseBuilder courseBuilder){ 11 this.courseName = courseBuilder.courseName; 12 this.coursePPT = courseBuilder.coursePPT; 13 this.courseVideo = courseBuilder.courseVideo; 14 this.courseArticle = courseBuilder.courseArticle; 15 this.courseQA = courseBuilder.courseQA; 16 } 17 18 @Override 19 public String toString() { 20 return "Course{" + 21 "courseName='" + courseName + '\'' + 22 ", coursePPT='" + coursePPT + '\'' + 23 ", courseVideo='" + courseVideo + '\'' + 24 ", courseArticle='" + courseArticle + '\'' + 25 ", courseQA='" + courseQA + '\'' + 26 '}'; 27 } 28 29 public static class CourseBuilder { 30 private String courseName; 31 private String coursePPT; 32 private String courseVideo; 33 private String courseArticle; 34 private String courseQA; 35 36 public CourseBuilder builderCourseName(String courseName){ 37 this.courseName = courseName; 38 return this; 39 } 40 public CourseBuilder builderCoursePPT(String coursePPT){ 41 this.coursePPT = coursePPT; 42 return this; 43 } 44 public CourseBuilder builderCourseVideo(String courseVideo){ 45 this.courseVideo = courseVideo; 46 return this; 47 } 48 49 public CourseBuilder builderCourseArticle(String courseArticle){ 50 this.courseArticle = courseArticle; 51 return this; 52 } 53 public CourseBuilder builderCourseQA(String courseQA){ 54 this.courseQA = courseQA; 55 return this; 56 } 57 58 public Course builder(){ 59 return new Course(this); 60 } 61 } 62 }
1 package com.geely.design.pattern.creational.builder.v2; 2 3 import avro.shaded.com.google.common.collect.ImmutableSet; 4 5 import java.util.Set; 6 7 public class Test { 8 public static void main(String[] args) { 9 Course course = new Course.CourseBuilder() 10 .builderCourseArticle("JAVA设计模式精讲手记") 11 .builderCourseName("JAVA设计模式精讲") 12 .builderCoursePPT("JAVA设计模式精讲PPT") 13 .builderCourseQA("JAVA设计模式精讲问答") 14 .builderCourseVideo("JAVA设计模式精讲视频").builder(); 15 System.out.println(course); 16 Set<String> set = ImmutableSet.<String>builder().add("a").add("b").build(); 17 System.out.println(set); 18 } 19 }