Builder 模式的变种 类似于AlertDialog

本文介绍了一个使用Builder模式创建不可变User对象的例子。User类通过私有构造函数确保外部无法直接实例化,所有必选属性设为final并在构造函数中初始化。Builder模式允许流畅地设置属性,提高代码可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.z.designsupportlibrarydemo;

/**
 * Created by Administrator on 2018/3/4 0004.
 */

public class User {
    private final String mFirstName;//必选
    private final String mLastName;//必选
    private final String mGender;//可选
    private final String mAge;//可选
    private final String mPhoneNo;//可选

    public User(Builder builder) {
        this.mFirstName = builder.firstName;
        this.mLastName = builder.lastName;
        this.mGender = builder.gender;
        this.mAge = builder.age;
        this.mPhoneNo = builder.phoneNo;
    }

    public String getmFirstName() {
        return mFirstName;
    }

    public String getmLastName() {
        return mLastName;
    }

    public String getmGender() {
        return mGender;
    }

    public String getmAge() {
        return mAge;
    }

    public String getmPhoneNo() {
        return mPhoneNo;
    }

    public static class Builder {
        private final String firstName;//必选
        private final String lastName;//必选
        private String gender;//可选
        private String age;//可选
        private String phoneNo;//可选

        public Builder(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }

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

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

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

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

    @Override
    public String toString() {
        return "User{" +
                "mFirstName='" + mFirstName + '\'' +
                ", mLastName='" + mLastName + '\'' +
                ", mGender='" + mGender + '\'' +
                ", mAge='" + mAge + '\'' +
                ", mPhoneNo='" + mPhoneNo + '\'' +
                '}';
    }
}

public class FloatingActionButtonActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_floatingactionbutton);

        findViewById(R.id.fab_check).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String str = new User.Builder("飞飞", "可爱").age("25").gender("家里蹲").phoneNo("110").mbuilder().toString();
                Toast.makeText(FloatingActionButtonActivity.this, "我被点击了" + str, Toast.LENGTH_LONG).show();
            }
        });
    }
}

从上面的代码可以看出一下几点:

User类的构造函数是私有的,意味着调用者不能直接实例化这个类。

User类是不可变的,所有必选的属性都是final的并且在构造函数中设置;同时,对属性值只提供getter函数。

Builder 使用Fluent Interface惯用法,使得类的使用者代码可读性更佳。

Builder 的构造函数只接收必选的属性值作为参数,并且只有必选的属性值设置为final,已此保证他们在构造函数中设置。


以上是学习<Android 高级进阶> 一书中得来....感谢....





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值