建造者(Builder)模式

变种建造者模式

由于变种建造者模式经常见到所以在这里只讲解该模式。
需求:今天Boss突然跑过来扔了一个需求给你:需要创建一个不可变的Person对象,这个Person可以拥有以下几个属性:名字、性别、年龄、车、钱、房子。其中名字和性别是必须有的。

结果:

public class Person {

    // 由于对象是不可变的,所以对象的每一个属性都是final

    // 名字
    private final String name;

    // 性别
    private final String sex;

    // 年龄
    private final Integer age;

    // 车
    private final String car;

    // 钱
    private final Double money;

    // 房子
    private final String house;


    private Person(Builder builder){
        this.name = builder.name;
        this.sex = builder.sex;
        this.age = builder.age;
        this.car = builder.car;
        this.house = builder.house;
        this.money = builder.money;
    }

    public static class Builder{
        
        // 名字和性别是必须有的,所以是final,其余是可选的
        private final String name;

        private final String sex;

        private Integer age;

        private String car;

        private Double money;

        private String house;

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

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

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

        public Builder money(Double money){
            this.money = money;
            return this;
        }

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

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

测试代码:

 public static void main(String[] args) {
        Person person = new Builder("张三","男")
                        .age(30)
                        .car("BMW")
                        .money(123456789D)
                        .house("别墅").build();
                
    }
由于这个Person对象是不可变的,所以毫无疑问我们给他的所有属性都加了final修饰,当然如果没有不可变的需求也是可以不加的,然后在Person类中定义一个内部类Builder,这个Builder内部类中的属性要和Person中的相同,并且必须有的属性要用final修饰,防止这些属性没有被赋值,其他非必须的属性不能用final,因为如果加了final,就必须对其进行初始化,这样这些非必须的属性又变成必须的。然后内部类中定义了一个构造方法,传入必须有的属性。其他非必须的属性都通过方法设置,每个方法都返回Builder对象自身。最后定义了一个build方法,将Builder对象传入Person的私有构造方法,最终返回一个对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值