设计模式-建造者模式

Posted by YaPi on May 10, 2018

基础定义

  • 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,使用多个简单的对象一步一步构建成一个复杂的对象
  • 用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道
  • 创建型

使用场景:

  1. 如果一个对象有非常复杂的内部结构(属性)
  2. 想把复杂对象的创建和使用分离

优点:

  1. 封装性好,创建和使用分离
  2. 结偶

缺点:

  1. 产生很多的Builder方法,内部结构若过于复杂,将会导致整个系统变得非常庞大,不利于控制。
  2. 产品内部发生变化,建造者模型也要变化

建造者模式更注重方法的调用,工厂模式注重创建产品。建造者可以创建复杂的模型,工厂模式创建的产品比较单一。

源码实例
  1. 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);
    }
}