Java中的Builder模式构建对象(Scala,python不需要)

package com.troila.test;

/**
 * @description
 * 在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则。

我们常常会面临编写一个这样的实现类(假设类名叫BuilderTest),这个类拥有多个构造函数,

BuilderTest(String name);

BuilderTest(String name, int age);

BuilderTest(String name, int age, String address);

BuilderTest(String name, int age, int sex, String address);

这样一系列的构造函数主要目的就是为了提供更多的客户调用选择,以处理不同的构造请求。
这种方法很常见,也很有效力,但是它的缺点也很多。
类的作者不得不书写多种参数组合的构造函数,而且其中还需要设置默认参数值,这是一个需要细心而又枯燥的工作。
其次,这样的构造函数灵活性也不高,而且在调用时你不得不提供一些没有意义的参数值,例如,BuilderTest("allen", -1, "BEIJING"),显然年龄为负数没有意义,但是你又不的不这样做,得以符合Java的规范。
如果这样的代码发布后,后面的维护者就会很头痛,因为他根本不知道这个-1是什么含义。
对于这样的情况,就非常适合使用Builder模式。
Builder模式的要点就是通过一个代理来完成对象的构建过程。
这个代理职责就是完成构建的各个步骤,同时它也是易扩展的。
 * @author: ZhiWen
 * @create: 2020-07-03 15:43
 **/
public class BuilderTest {
    //假设这里有比较多的属性

    private String name;
    private Integer age;
    private Integer sex;
    private String address;

    //私有全参构造
    private BuilderTest(String name, Integer age, Integer sex, String address) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.address = address;
    }
    //只提供get
    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public Integer getSex() {
        return sex;
    }

    public String getAddress() {
        return address;
    }



    /*提供创建Builder的静态方法*/
    public static BuilderTest.Builder builder(){
        return new BuilderTest.Builder();
    }

    //通过一个内部的Builder来完成对象的构建过程
    public static class Builder{
        private String name;
        private Integer age;
        private Integer sex;
        private String address;

        //只提供set并返回Builder,可链式编程
        public BuilderTest.Builder name(String name) {
            this.name = name;
            return this;
        }

        public BuilderTest.Builder age(Integer age) {
            this.age = age;
            return this;
        }

        public BuilderTest.Builder sex(Integer sex) {
            this.sex = sex;
            return this;
        }

        public BuilderTest.Builder address(String address) {
            this.address = address;
            return this;
        }

        //构建对象
        public BuilderTest build(){
            return new BuilderTest(name,age,sex,address);
        }
    }
}

//链式调用,灵活传参
BuilderTest build = BuilderTest.builder().name("zhangsan").sex(1).address("beijing").build();
        System.out.println(build.getName()+"\t-->\t"+build.getAddress());

Lombok插件的@Builder注解可以实现同样的效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值