设计模式(1)之建造者模式(Builder)

建造者模式

给定一个模板,通过配置不同的属性,产生不同的对象

常用建造对象的两种方式比较

如果用重载构造方法的办法产生对象,那么如果类属性过多,
①需要写很多重载构造方法
②由于属性过多可能不知道对应位置的是哪个属性
③需要对你不需要的一些属性赋予默认值

如果用空构造方法产生对象,然后用set()给属性赋值,
①重复调用set(),可能导致c端拿到不完整的对象
②在多线程的情况下,无法保证属性的一致性
③成员变量不可以是 final 类型,失去了不可变对象的很多好处

通过建造者模式可以避免上面这些问题,下面是Builder的一个模板类

public class User {

    private final String name;

    private final int sex;

    private int age;

    private String phone;

    private String address;

    private User(Builder builder) {
        name = builder.name;
        sex = builder.sex;
        age = builder.age;
        phone = builder.phone;
        address = builder.address;
    }

    public String getName() {
        return name;
    }

    public int getSex() {
        return sex;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }

    public String getAddress() {
        return address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", sex=" + sex +
                ", age=" + age +
                ", phone='" + phone + '\'' +
                ", address='" + address + '\'' +
                '}';
    }

    private static class Builder {

        private final String name;

        private final int sex;

        private int age;

        private String phone;

        private String address;

        public Builder(String name , int sex) {
            this.name = name;
            this.sex = sex;
        }

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

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

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

        public User build() {
            return new User(this);
        }

    }

}

调用方式:

User user = new User.Builder("Alex", 1).age(28).phone("13264497440").address("China").build();

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值