创建型-建造者模式


一、简介

建造者模式(Bulider Pattern)是将一个复杂对象的构建过程与它的实现表示分离,使得同样的构建过程可以创建不同的表示,属于创建型模式。使用创建者模式对于用户而言只需要制定需要建造的类就可以获得对象,建造过程及细节不需要了解。

建造者模式的应用场景

建造者模式适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产品的各个零件经常猛烈变化,但是他们的组合方式却相对稳定。

建造者模式适用于以下的几种场景:

  • 1、相同的方法,不同的执行顺序,产生不用的结果时
  • 2、多个部件或者零件,都可以装配到一个对象中,但是产生的结果又不相同
  • 3、产品非常复杂,或者产品类中的调用顺序不用产生不同的作用
  • 4、当时初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时

建造者模式的设计主要有四个角色:

  • 产品(Product):要创建的产品对象
  • 建造者抽象(Builder):建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程。
  • 建造者(ConreteBuilder):具体的Builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建。
  • 调用者(Diretor):调用具体的建造者,来创建对象的各个部分,在调用者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

二、代码

1、创建产品类

@Data
public class Course {
    private String id;

    private String name;
    private String ppt;
    private String video;
    private String note;

    private String homework;
}

2、建造者接口

建造者抽象(Builder):建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程。

public interface Builder{
    void build();
}

3、建造者

建造者(ConreteBuilder):具体的Builder类,根据不同的业务逻辑,具体化对象的各个组成部分的创建。

public class ConreteBuilder implments Builder{

    private Course course;

    public static ConreteBuilder builder() {
        return new ConreteBuilder();
    }

    private ConreteBuilder() {
        course = new Course();
    }

    public CourseBuilder addName(String name) {
        course.setName(name);
        return this;
    }

    public CourseBuilder addId(String id) {
        course.setId(id);
        return this;
    }

    @Override
    public Course build() {
        // 检验属性 和 设置默认值
        if (course.id == null) {
            course.setId = UUID.randomUUID().toString();
        }
        return this.course;
    }
}

4、调用

调用者(Diretor):调用具体的建造者,来创建对象的各个部分,在调用者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

public class Test {
    public static void main(String[] args) {
        CourseBuilder builder = new CourseBuilder();

        Course c = Course.builder()
              .addName("设计模式")
              .addPPT("12314551123")
              .build();

        System.out.println(c);

    }
}

三、BeanDefinitionBuilder

public final class BeanDefinitionBuilder {

    private final AbstractBeanDefinition beanDefinition;

    public static BeanDefinitionBuilder genericBeanDefinition() {
        return new BeanDefinitionBuilder(new GenericBeanDefinition());
    }

    private BeanDefinitionBuilder(AbstractBeanDefinition beanDefinition) {
        this.beanDefinition = beanDefinition;
    }


    /**
     * 校验并且返回创建的 BeanDefinition 对象.
     */
    public AbstractBeanDefinition getBeanDefinition() {
        this.beanDefinition.validate();
        return this.beanDefinition;
    }


    /**
     * Set the name of the parent definition of this bean definition.
     */
    public BeanDefinitionBuilder setParentName(String parentName) {
        this.beanDefinition.setParentName(parentName);
        return this;
    }

    /**
     * Set the name of a static factory method to use for this definition,
     * to be called on this bean's class.
     */
    public BeanDefinitionBuilder setFactoryMethod(String factoryMethod) {
        this.beanDefinition.setFactoryMethodName(factoryMethod);
        return this;
    }
}

  目录