美文网首页设计模式
设计模式--建造者(Builder)模式

设计模式--建造者(Builder)模式

作者: 二妹是只猫 | 来源:发表于2019-03-20 13:12 被阅读0次
    模式介绍
    • 建造者模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构造细节的情况下,可以更精细的控制对象的构造流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。
    定义与类型
    • 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
    • 用户只需要指定需要建造的类型就可以得到它们,建造过程中的细节不需要知道
    • 类型:创建型
    使用场景
    • 如果一个对象有非常复杂的内部结构(很多属性)
    • 想把复杂对象的创建和使用分离
    优点
    • 封装性好,创建和使用分离
    • 扩展性好、建造类之间独立、一定程度上解耦
    缺点
    • 产生多余的Builder对象
    • 产品内部发生变化,建造者都要修改,成本较大
    工厂模式的区别:
    • 建造者更注重方法的调用顺序
    • 建造者可以创建复杂的产品由各种复杂的部件组成,工厂模式创建的都是一个样
    • 工厂模式只关注产品被创建出来,建造者模式关心组成的细节

    建造者模式有4个对象:

    Product(产品角色):一个具体的产品对象。
    Builder(抽象建造者):创建一个Product对象的各个部件指定的抽象接口。
    ConcreteBuilder(具体建造者):实现抽象接口,构建和装配各个部件。
    Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

    UML类图

    Builder-Pattern.png
    以一个课程为例讲解上面4个对象的使用
    • Product(产品角色):
    public class Course {
        private String courseName;
        private String coursePPT;
        private String courseVideo;
        private String courseArticle;
    }
    
    • Builder(抽象建造者)
    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();
    
    }
    
    • ConcreteBuilder(具体建造者)
    public class CourseActualBuilder extends CourseBuilder {
        private Course course = new Course();
        @Override
        public void buildCourseName(String courseName) {
            course.setCourseName(courseName);
        }
        @Override
        public void buildCoursePPT(String coursePPT) {
            course.setCoursePPT(coursePPT);
        }
        @Override
        public void buildCourseVideo(String courseVideo) {
            course.setCourseVideo(courseVideo);
        }
        @Override
        public void buildCourseArticle(String courseArticle) {
            course.setCourseArticle(courseArticle);
        }
        @Override
        public void buildCourseQA(String courseQA) {
            course.setCourseQA(courseQA);
        }
        @Override
        public Course makeCourse() {
            return course;
        }
    }
    
    • Director(指挥者):
    public class Coach extends CourseActualBuilder {
        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();
        }
    }
    

    无须关心产品对象的具体组装过程,只需确定具体建造者的类型即可,建造者模式将复杂对象的构建与对象的表现分离开来,这样使得同样的构建过程可以创建出不同的表现:

    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);
     }
    

    建造者模式升级版--链式调用(实际项目常出现的形式,下面用例ImmutableSet就是这样设计的):

    public class Course {
        private String courseName;
        private String coursePPT;
        private String courseVideo;
        private String courseArticle;
        //question & answer
        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;
        }
        @Override
        public 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 & answer
            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 static void main(String[] args) {
          Course course = new Course.CourseBuilder().buildCourseName("Java设计模式精讲").buildCoursePPT("Java设计模式精讲PPT").buildCourseVideo("Java设计模式精讲视频").build();
          System.out.println(course);
          'guava中的使用'
          Set<String> set = ImmutableSet.<String>builder().add("a").add("b").build();
          System.out.println(set);
      }
    

    建造者模式在android框架retrofit中的运用

    相关文章

      网友评论

        本文标题:设计模式--建造者(Builder)模式

        本文链接:https://www.haomeiwen.com/subject/oipamqtx.html