基础定义
- 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,使用多个简单的对象一步一步构建成一个复杂的对象
 - 用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
 - 创建型
 
使用场景:
- 如果一个对象有非常复杂的内部结构(属性)
 - 想把复杂对象的创建和使用分离
 
优点:
- 封装性好,创建和使用分离
 - 结偶
 
缺点:
- 产生很多的Builder方法,内部结构若过于复杂,将会导致整个系统变得非常庞大,不利于控制。
 - 产品内部发生变化,建造者模型也要变化
 
建造者模式更注重方法的调用,工厂模式注重创建产品。建造者可以创建复杂的模型,工厂模式创建的产品比较单一。
源码实例
- StringBuilder、StringBuffer
 
代码实例
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.courseArticle = courseBuilder.courseArticle;
        this.coursePPT = courseBuilder.coursePPT;
        this.courseVideo = courseBuilder.courseVideo;
        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("Python")
                .buildCoursePPT("Python PPT")
                .buildCourseArticle("Python Article")
                .buildCourseQA("Python QA")
                .buildCourseVideo("Python Video").build();
        System.out.println(course);
    }
}