设计模式--建造者模式

1. 建造者模式

1.1 概述

定义:

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

特征:

用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道

类型: 创建型

适用场景:

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

优点:

  • 封装性好,创建和使用分离
  • 扩展性好、建造类之间独立、一定程度上解耦

缺点:

  • 产生多余的Builder对象
  • 产品内部发生变化,建造者都要修改,成本较大

注意:

建造者模式和工厂模式比较相近,而建造者模式更注重方法的调用顺序,工厂模式注重创建场景;创建对象的力度不同,建造者模式可以创建一些复杂的产品,并且要知道由哪些复杂的部件组成(还有顺序、步骤),工厂模式只要创建起来就ok了,不管那么多。

1.2 代码理解

模拟的需求北京

视频教学网站有很多课程,一门课程包含手记、PPT、视频等内容。讲师负责课程这些内容的制作,视频教学网站的工作人员(就叫课程教练)与教师对接。 视频教学网站的老板,要发布一门课程会直接和课程教练沟通,课程教练与对应的讲师对接,然后共同制作课程。(课程教练相当于指挥官,根据讲师提供的视频、ppt等资料,拼装成一门课)

课程制作–课程建造器

课程实体类Course:

package com.gangbb.creational.builder;

/**
 * @author Gangbb
 * @date 2021/4/16 21:10
 * @Description: 课程实体类
 */
public class Course {
    private String courseName;
    private String coursePPT;
    private String courseVideo;
    private String courseArticle;

    //question & answer
    private String courseQA;

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getCoursePPT() {
        return coursePPT;
    }

    public void setCoursePPT(String coursePPT) {
        this.coursePPT = coursePPT;
    }

    public String getCourseVideo() {
        return courseVideo;
    }

    public void setCourseVideo(String courseVideo) {
        this.courseVideo = courseVideo;
    }

    public String getCourseArticle() {
        return courseArticle;
    }

    public void setCourseArticle(String courseArticle) {
        this.courseArticle = courseArticle;
    }

    public String getCourseQA() {
        return courseQA;
    }

    public void setCourseQA(String courseQA) {
        this.courseQA = courseQA;
    }

    @Override
    public String toString() {
        return "Course{" +
                "courseName='" + courseName + '\'' +
                ", coursePPT='" + coursePPT + '\'' +
                ", courseVideo='" + courseVideo + '\'' +
                ", courseArticle='" + courseArticle + '\'' +
                ", courseQA='" + courseQA + '\'' +
                '}';
    }
}

课程抽象建造者CourseBuilder

package com.gangbb.creational.builder;

/**
 * @author Gangbb
 * @date 2021/4/16 21:11
 * @Description: 课程抽象建造者
 */
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();

}

课程实际建造者类CourseActualBuilder

package com.gangbb.creational.builder;

/**
 * @author Gangbb
 * @date 2021/4/16 21:13
 * @Description: 课程实际建造者类
 */
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;
    }
}

课程教练类Coach

package com.gangbb.creational.builder;

/**
 * @author Gangbb
 * @date 2021/4/16 21:33
 * @Description: 课程教练类
 */
public class Coach {
    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();
    }
}

此时UML类图:

image-20210416214940919

测试使用类Test

package com.gangbb.creational.builder;

/**
 * @author Gangbb
 * @date 2021/4/16 21:38
 * @Description:
 */
public class Test {
    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);

    }
}

此时Test相当于老板,可以创建 课程教练并告诉它以用什么实际的CourseBuilder来创建课程,示例中的CourseActualBuilder可以衍生为更多的前端课程、python课程等!

V2版本:用静态内部类构造器

Course

package com.gangbb.creational.builder.v2;

/**
 * @author Gangbb
 * @date 2021/4/16 22:01
 * @Description:
 */
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);
        }



    }
}

Test

package com.gangbb.creational.builder.v2;

import com.google.common.collect.ImmutableSet;

import java.util.Set;

/**
 * @author Gangbb
 * @date 2021/4/16 22:23
 * @Description:
 */
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);
    }
}

1.3 开源框架源码使用分析

1.3.1 JDK中的Builder

package java.lang.StringBuilder

1.3.2 ImmutableSet

使用

Set<String> set = ImmutableSet.<String>builder().add("a").add("b").build();

1.3.3 spring中的BeanDefinitionBuilder

package org.springframework.beans.factory.support.BeanDefinitionBuilder

1.3.4 mybatis中的SqlSessionFactoryBuilder

package org.apache.ibatis.session.SqlSessionFactoryBuilder

1.4 趣味理解

MM 最爱听的就是「我爱你」这句话了,见到不同地方的 MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到 MM 我只要按对应的键,它就能够用相应的语言说出「我爱你」这句话了,国外的 MM 也可以轻松搞掂,这就是我的「我爱你」builder。建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值