Builder设计模式

作者: Coding小聪 | 来源:发表于2019-04-14 23:58 被阅读5次

概述

Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
其通用类图如下所示:


Builder模式类图
  • 产品类,实际要构建出的对象
public class Product {   }
  • 抽象构建者
public abstract class Builder {    
    //设置产品的不同部分,以获得不同的产品    
    public abstract void setPart();    
    //建造产品    
    public abstract Product buildProduct();
}
  • 具体构建者,实现抽象构建者中定义的所有方法,并返回一个构建好的对象
public class ConcreteProduct extends Builder {    
    private Product product = new Product();    
    //设置产品零件    
    public void setPart(){       
         /* * 产品类内的逻辑处理 */    
    }    
    //组建一个产品    
    public Product buildProduct() {        
        return product;    
    }
}
  • 导演类,负责安排已有模块的顺序,然后告诉Builder开始建造。
public class Director {    
    private Builder builder = new ConcreteProduct();    
    //构建不同的产品    
    public Product getAProduct(){       
        builder.setPart();        
        /** 设置不同的零件,产生不同的产品 */        
        return builder.buildProduct();   
    }
}

应用场景

优雅地创建复杂对象,适用于对通过多个参数构造对象进行重构。

优缺点

优点:

  • 解耦,逻辑清晰,对象的构建统一交由Builder类;
  • 链式调用,使用灵活。

缺点:

  • 增加Builder类的维护,每次构建需要先创建对应的 Builder 对象。

源码中的Builder模式

Builder模式的代码自动生成

在Idea中settings-->plugins搜索builder,安装结果中的第一个插件Builder Generator

现有以下Bean对象,我们要为其创建builder对象。

public class PersonDTO {
    private String name;
    private String sex;
    private int age;
    private Date birthday;
    // 省略get/set方法
}

使用快捷键Alt + Insert,在出现的菜单中选择Builder。

如果Builder类只作为内部类,不单独创建,可勾选Inner builder

生成后的代码如下:

public class PersonDTO {
    private String name;
    private String sex;
    private int age;
    private Date birthday;

    public static final class PersonDTOBuilder {
        private String name;
        private String sex;
        private int age;
        private Date birthday;

        private PersonDTOBuilder() {
        }

        public static PersonDTOBuilder aPersonDTO() {
            return new PersonDTOBuilder();
        }

        public PersonDTOBuilder withName(String name) {
            this.name = name;
            return this;
        }

        public PersonDTOBuilder withSex(String sex) {
            this.sex = sex;
            return this;
        }

        public PersonDTOBuilder withAge(int age) {
            this.age = age;
            return this;
        }

        public PersonDTOBuilder withBirthday(Date birthday) {
            this.birthday = birthday;
            return this;
        }

        public PersonDTO build() {
            PersonDTO personDTO = new PersonDTO();
            personDTO.setName(name);
            personDTO.setSex(sex);
            personDTO.setAge(age);
            personDTO.setBirthday(birthday);
            return personDTO;
        }
    }
}

相关文章

网友评论

    本文标题:Builder设计模式

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