1、建造者定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用户只需要指定需要创建的类型就可以得到它们,建造过程及细节不需要知道。适用场景:1) 如果一个对象具有非常复杂的内部结构(很多属性)2) 想把复杂对象的创建和使用分离优点:1) 封装性好,创建和使用分离2) 扩展性好、建造类之间独立,一定程度上解耦缺点:1) 产生多余的Builder对象2) 产品内部发生变化,建造者都要修改,成本较大

2、代码演示

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;        this.courseQA = courseBuilder.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.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);        }    }}
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);        Set<String> set = ImmutableSet.<String>builder().add("a").add("b").build();        System.out.println(set);    }}