构造器设计模式

在类中定义一个静态内部类,在这个静态内部类中定义和外部类一样的属性并提供返回内部类的一些列方法,通过这些方法给属性赋值,在内部类的构造函数中还可以同时赋属性的默认值,最后通过内部类的 build 方法将内部对象传递给外部类的私有构造方法来实例化外部类并返回给调用者;

同时还可以在外部类中提供一个静态的 builder 方法,直接实例化一个内部的 Builder 类返回,这样使用时候就可以直接 build 了,不用再 new 外部类了;

package bean;

public class User {
    private int id;
    private String username;
    private String sex;
    private String addr;

    public static class Builder{
        private int id;
        private String username;
        private String sex = "男";
        private String addr;

        // 无参子类构造方法
        public Builder() {

        }

        // 给某些属性赋初值的子类构造方法
        public Builder(String addr) {
            this.addr = addr;
        }

        public Builder id(Integer id){
            this.id = id;
            return this;
        }
        public Builder username(String username){
            this.username = username;
            return this;
        }
        public Builder sex(String sex){
            this.sex = sex;
            return this;
        }
        public Builder addr(String addr){
            this.addr = addr;
            return this;
        }
        public User build(){
            return new User(this);
            // 或者直接在此调用父类全参的构造方法
            //return new User(id, username, sex, addr);
        }
    }

    private User(Builder builder) {
        id = builder.id;
        username = builder.username;
        sex = builder.sex;
        addr = builder.addr;
    }

    private User(int id, String username, String sex, String addr) {
        this.id = id;
        this.username = username;
        this.sex = sex;
        this.addr = addr;
    }

    // 在父类提供静态的 builder 方法返回子类
    public static Builder builder(){
        return new Builder();
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", sex='" + sex + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }

    public static void main(String[] args) {
        // 方式1
        User user1 = new User.Builder().id(1).username("zhangsan").sex("男").addr("北京").build();
        System.out.println("user1: " + user1.toString());

        // 方式2
        User user2 = User.builder().id(2).username("lisi").sex("女").addr("上海").build();
        System.out.println("user2: " + user2.toString());
    }
}

运行,输出:

user1: User{id=1, username='zhangsan', sex='男', addr='北京'}
user2: User{id=2, username='lisi', sex='女', addr='上海'}

注:也可以在类上通过 lombok 的 @Builder 注解实现构造器模式;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值