优雅使用Builder模式(构建者模式)

优雅使用Builder模式(构建者模式)

简单介绍

Builder 模式是一种创建型设计模式,用于构建复杂对象,强调的是 管理依赖关系或者约束条件。它允许构建一个包含许多可选参数的对象,同时保持构造函数的简洁性。

在 Builder 模式中,通常会定义一个 Builder 类,用于设置对象的各个参数,最后通过调用 build 方法来构建对象。这样可以避免构造函数参数过多导致的混乱,同时还可以保证对象在构建过程中处于一种一致的状态。

优雅使用

干巴巴的文字总是抽象的,我这边就直接上代码好了。

假设我们有一个 HttpParameters 类用于封装 HTTP 请求的参数。这个类包含一个静态内部类 Builder,用于构建 HttpParameters 对象。下面我们将展示如何使用 Builder 模式来构建 HttpParameters 对象:

首先是 HttpParameters 类:

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

@Getter
@AllArgsConstructor
public class HttpParameters {
    private Builder builder;

    public static Builder newBuilder() {
        return new Builder();
    }

    @Getter
    public static class 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 HttpParameters build() {
            // 执行校验
            validate(); 

            // ... 其他的构建逻辑
            return new HttpParameters(this);
        }

        private void validate() {
            if (StringUtils.isBlank(url)) {
                throw new IllegalStateException("URL cannot be blank");
            }
            if (parameter == null) {
                throw new IllegalStateException("Parameter cannot be null");
            }
            if (StringUtils.isBlank(httpType)) {
                throw new IllegalStateException("HTTP type cannot be blank");
            }
            // 可以添加更多的校验逻辑
        }
    }
}

下面是使用 Builder 模式构建的 HttpParameters

import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

public class Main {
    public static void main(String[] args) {
        // 使用静态方法 newBuilder() 创建 Builder 对象
        HttpParameters.Builder builder = HttpParameters.newBuilder();

        // 使用 Builder 对象设置参数
        builder.url("https://example.com/api/endpoint")
                .httpType("GET")
                .parameter("someParameter");

        // 构建 HttpParameters 对象
        HttpParameters httpParameters = builder.build();

        // 使用 @Getter 注解确保可以访问 Builder 类中定义的字段
        System.out.println("URL: " + httpParameters.getBuilder().getUrl());
        System.out.println("HTTP Type: " + httpParameters.getBuilder().getHttpType());
        System.out.println("Parameter: " + httpParameters.getBuilder().getParameter());
    }
}

或者:

public class Main {
    public static void main(String[] args) {
        HttpParameters httpParameters = HttpParameters.newBuilder()
                .url("https://example.com/api/endpoint")
                .httpType("GET")
                .parameter("someParameter")
                .build();

        System.out.println("URL: " + httpParameters.getBuilder().getUrl());
        System.out.println("HTTP Type: " + httpParameters.getBuilder().getHttpType());
        System.out.println("Parameter: " + httpParameters.getBuilder().getParameter());
    }
}

在上面的代码中,我们使用 Builder 模式构建了一个 HttpParameters 对象,然后通过链式调用优雅地设置了 url、httpType和parameter这些变量,最后最后调用 build 方法来构建对象同时进行相应的参数校验。可以看出Builder 模式使得构建复杂对象的过程更加灵活和可控。

应用场景

Builder 模式应用场景:如果类的属性之间有一定的依赖关系或者约束条件,那么就可以考虑使用 Builder 设计模式。

Builder 模式通常在以下情况下特别有用:

  1. 构建复杂对象: 当您需要创建具有许多可选参数的复杂对象时,Builder 模式可以提供一种优雅的方式来构建对象,避免使用过多的构造函数参数。
  2. 避免重叠构造函数: 当类具有多个构造函数,且参数列表重叠或非常相似时,Builder 模式可以提供一种更清晰的构建过程,使代码更易于阅读和维护。
  3. 参数校验: 使用 Builder 模式可以在构建对象的过程中执行参数校验,确保所有必要的参数都已设置,并在必要时抛出异常,使得代码更加健壮和可靠。
  4. 创建不可变对象: 当您希望创建不可变对象时,可以在 Builder 模式中设置对象的属性,并在构建后使得对象不可变,提高对象的安全性和线程安全性。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Poldroc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值