Builder构建者模式

Builder构建者模式主要表现在:如果类的属性之间有一定的依赖关系或者约束条件,那么可以使用构建者设计模式对类对象进行创建

将创建对象时使用的繁杂的setter方法去除,通过链式进行选择性的属性赋值并创建获取对象

应用场景

如果需要创建某个类A的实例对象,而对象中包含许多的属性,构造器函数过多以及属性之间存在依赖关系和约束条件

  1. 首先需要获取该实体类对应的ABuilder对象
  2. ABuilder对象中包括类A的属性信息以及对应属性值的设置方法
  3. ABuilder中还包含一个build方法,该方法主要负责将属性填充到类A中
  4. 未传值的属性使用默认值
@Getter
@Setter
public class A {
    private String url;
    private Object parameter;
    private String httpType;
    public static ABuilder newABuilder() { return new ABuilder(); }
    private A(String url, Object parameter, String httpType) { 
        this.url = url; 
        this.parameter = parameter;
        this.httpType = httpType;
    }
}

@Getter
@Setter
public static class ABuilder{ //Builder类同时也可以作为类的内部类定义
    private String url;
    private Object parameter;        
    private String httpType;
    public Builder parameter(Object parameter) { this.parameter = parameter; return this;}
    public Builder url(String url) { this.url = url; return this; }
    public Builder httpType(String httpType) { this.httpType = httpType; return this; }
    public A build() {
        if (StringUtils.isBlank(url)) {throw new RuntimeException("URL不允许为空 "); }
        // ...
        return new A(url, parameter, httpType);
    }
}

当我们想要创建一个A类实例对象时,即可通过ABuilder类进行链式的创建

A a = A.newABuilder()
    .url("192.168.*.*")
    .parameter(parameter)
    .httpType("1")
    .build();

@Builder

同时我们也可以引用lombok的@Builder注解直接完成builder设计模式的使用,该注解在A类中创建了一个ABuilder的静态内部类,而无需手动在类中再创建newABuilder()方法

首先引入Lombok的依赖坐标:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
@Getter
@Setter
@Builder
public class A {
    private String url;
    private Object parameter;
    private String httpType;
    //public static ABuilder builder() { return new ABuilder(); }
    private A(String url, Object parameter, String httpType) { 
        this.url = url; 
        this.parameter = parameter;
        this.httpType = httpType;
    }
    
    //@Builder注解相当于在类A中创建了这样一个静态内部类
    /*public static class ABuilder{
        private String url;
        private Object parameter;        
        private String httpType;
        public Builder parameter(Object parameter) { this.parameter = parameter; return this;}
        public Builder url(String url) { this.url = url; return this; }
        public Builder httpType(String httpType) { this.httpType = httpType; return this; }
        public A build() {
            if (StringUtils.isBlank(url)) {throw new RuntimeException("URL不允许为空 "); }
            // ...
            return new A(url, parameter, httpType);
        }
    }*/
}

//创建类A的实例对象
A a = A.builder()
    .url("192.168.*.*")
    .parameter(parameter)
    .httpType("1")
    .build();

@Builder.Default可设置非final属性的默认值

@Builder.Default
private String url = "192.168.*.*";

@Builder(toBuilder = true)表示可对该对象进行拷贝生成新的对象,可用于对已生成的对象属性进行修改,默认为false

@Builder(toBuilder = true)
public class A {
    //...
}
//创建类A的实例对象
A a = A.builder()
    .url("192.168.*.*")
    .parameter(parameter)
    .httpType("1")
    .build();

//修改类A的属性信息
a.toBuilder().
    .url("192.168.*.*")
    .parameter(parameter)
    .httpType("1")
    .build();

总结:通过Builder构建者设计模式可实现创建对象填充属性时的链式操作,从而减少大量的set操作,提高代码的可读性。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值