JAVA设计模式之建造者模式

JAVA设计模式之建造者模式-创建型

1. 定义

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

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

2. 类型

创建型

3. 适用场景

如果一个对象有非常复杂的内部结果(很多属性)

想把复杂对象的创建和使用分离

4. 优点

封装性好,创建和使用分离

扩展性好、建造类之间独立、一定程度上解耦

5. 缺点

产生多余的builder对象

铲平内部发生变化,建造者都要修改,成本较大

6. 相关设计模式

建造者模式和工厂模式

建造者模式注重方法的调用顺序,而工厂模式注重创建产品,创建力度不同,可以创建复杂的部位组成,而工厂模式创建的都是一样的

7. coding

原型以课程为例,课程 包含 名称 PPT 视频 手记 问答 抽象者建立创建课程名称 PPT 视频 手记 问答 ,实际的创建者创建课程名称 PPT 视频 手记 问答,由讲师来进行创建具体的课程类

7.1 课程类

package com.maidou.learning.design.creatation.builder;


import lombok.Data;
import lombok.ToString;

/**
 * @Author maicheng
 * @Description : 课程类
 * @Date 23:12 2022/10/26
 **/
@Data
@ToString
public class Course {

    private String courseName;

    private String coursePPT;

    private String courseVideo;

    private String courseArticle;

    private String courseQA;
}

7.2 创建课程的抽象类

package com.maidou.learning.design.creatation.builder;

/**
 * @ClassName CourseBuilder * @Description TODO
 * @Author maido
 * @Date 23:12 2022/10/26
 * @Version 1.0
 **/
public abstract class CourseBuilder {

    public abstract void setCourseName(String courseName);

    public abstract void setCoursePPT(String coursePPT);

    public abstract void setCourseVideo(String courseVideo);

    public abstract void setCourseArticle(String courseArticle);

    public abstract void setCourseQA(String courseQA);

    public abstract Course createCourse();
}

7.3 创建课程的继承类

package com.maidou.learning.design.creatation.builder;

/**
 * @ClassName CourseActualBuilder * @Description TODO
 * @Author maido
 * @Date 23:15 2022/10/26
 * @Version 1.0
 **/
public class CourseActualBuilder extends CourseBuilder{

    private Course course = new Course();

    @Override
    public void setCourseName(String courseName) {
        course.setCourseName(courseName);
    }

    @Override
    public void setCoursePPT(String coursePPT) {
        course.setCoursePPT(coursePPT);
    }

    @Override
    public void setCourseVideo(String courseVideo) {
        course.setCourseVideo(courseVideo);
    }

    @Override
    public void setCourseArticle(String courseArticle) {
        course.setCourseArticle(courseArticle);
    }

    @Override
    public void setCourseQA(String courseQA) {
        course.setCourseQA(courseQA);
    }


    @Override
    public Course createCourse() {

        return course;
    }
}

7.4 讲师根据抽象的课程创建具体的课程信息

package com.maidou.learning.design.creatation.builder;

/**
 * @ClassName Coach
 * @Description 教练
 * @Author maido
 * @Date 23:21 2022/10/26
 * @Version 1.0
 **/
public class Coach {

    private CourseBuilder courseBuilder;

    public Coach(CourseBuilder courseBuilder) {
        this.courseBuilder = courseBuilder;
    }


    public Course createCourse(String courseName, String coursePPT, String courseVideo, String courseArticle,
                               String courseQA) {
        courseBuilder.setCourseName(courseName);
        courseBuilder.setCoursePPT(coursePPT);
        courseBuilder.setCourseVideo(courseVideo);
        courseBuilder.setCourseArticle(courseArticle);
        courseBuilder.setCourseQA(courseQA);

        return courseBuilder.createCourse();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fr2H6iDp-1666802010980)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221027000251197.png)]

7.5 改造 链式调用

package com.maidou.learning.design.creatation.builder.v2;

/**
 * @ClassName course
 * @Description TODO
 * @Author maido
 * @Date 0:06 2022/10/27
 * @Version 1.0
 **/
public class Course {

    private String courseName;

    private String coursePPT;

    private String courseVideo;

    private String courseArticle;

    private String courseQA;

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

    public Course(CourseBuilder courseBuilder) {
        this.courseName = courseBuilder.courseName;
        this.coursePPT = courseBuilder.coursePPT;
        this.courseVideo = courseBuilder.courseVideo;
        this.courseQA = courseBuilder.courseQA;
        this.courseArticle = courseBuilder.courseArticle;
    }

    public static class CourseBuilder {
        private String courseName;

        private String coursePPT;

        private String courseVideo;

        private String courseArticle;

        private String courseQA;


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

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

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

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

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

        public Course build() {

            return new Course(this);
        }
    }
}

测试

package com.maidou.learning.design.creatation.builder.v2;

/**
 * @ClassName MainTest
 * @Description TODO
 * @Author maido
 * @Date 0:17 2022/10/27
 * @Version 1.0
 **/
public class MainTest {

    public static void main(String[] args) {
        Course course = new Course.CourseBuilder().setCourseName("springboot测试").build();

        System.out.println(course);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rdgXmkNL-1666802010983)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221027002004320.png)]

8 源码解析

8.1 StringBuilder StringBuffer

8.1.1 来源
java.lang.StringBuilder
8.1.2 coding 标准的建造者模式
    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

8.2 BeanDefinitionBuilder

8.2.1 来源
org.springframework.beans.factory.support.BeanDefinitionBuilder
8.2.2 coding
  public static BeanDefinitionBuilder genericBeanDefinition() {
        return new BeanDefinitionBuilder(new GenericBeanDefinition());
    }

    public static BeanDefinitionBuilder genericBeanDefinition(String beanClassName) {
        BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
        builder.beanDefinition.setBeanClassName(beanClassName);
        return builder;
    }

    public static BeanDefinitionBuilder genericBeanDefinition(Class<?> beanClass) {
        BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
        builder.beanDefinition.setBeanClass(beanClass);
        return builder;
    }

    public static <T> BeanDefinitionBuilder genericBeanDefinition(Class<T> beanClass, Supplier<T> instanceSupplier) {
        BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
        builder.beanDefinition.setBeanClass(beanClass);
        builder.beanDefinition.setInstanceSupplier(instanceSupplier);
        return builder;
    }

以上可以看出返回的都是对象本身

8.3 其他

SqlSessionFactoryBuilder XmlConfigBuilder 等等都是建造者模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值