创建对象之Builder模式

本文介绍了如何使用Builder模式在Java中创建对象,特别是当对象需要多个可选参数时。通过示例展示了如何在客户端通过Person.PersonBuilder构建Person对象,并利用setter-like方法设置可选参数,最后通过build()方法创建实例。Builder模式确保了对象构建过程的灵活性和代码的整洁性。

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

/*
 * 创建对象的Builder模式
 * Builder模式只适合创建对象时需要指定多个可选参数的场景.
 * 客户端:
 * 1:在客户端可以通过下面代码获取Person对象
 * Person.PersonBuilder builder=new Person.PersonBuilder("111","王大少","男");
 * 这里以选择可选参数年龄爱好为例子演示;
 * Person person=builder.setAge(22).setHobby("reading").build();
 */
public class Person {
	/*
	 * 必要的参数
	 * 身份证号、姓名、性别
	 * 声明为private避免外部不安全的修改
	 */
    private String id;
    private String name;
    private String sex;
    /*
     * 可选参数
     * 年龄、电话、爱好、住址、学历;
     */
    private int age;
    private String phone;
    private String hobby;
    private String addr;
    private String major;
    /*
     * Person类私有的构造函数,为什么要用私有的构造函数?
     */
    private Person(PersonBuilder builder)
    {
    	this.id=builder.id;
    	this.name=builder.name;
    	this.sex=builder.sex;
    	this.age=builder.age;
    	this.phone=builder.phone;
    	this.hobby=builder.hobby;
    	this.addr=builder.addr;
    	this.major=builder.major;
    }
    /*
     * 调用setter,getter方法获取更改私有成员
     */
    public void setId(String id) {
       this.id=id;
    }
    public String getId() {
		return id;
	}
    /*
     * 这个PersonBuilder是专门用于创建Person对象的, 
     * 所以PersonBuilder类从属于Person类. 因此使用
     * 内部类可以清晰的表述这种从属关系.使用"静态"
     * 内部类则是为了在不存在Person对象时创建PersonBuilder对象
     */
	public static class PersonBuilder{
    	/*
    	 * 必要的参数
    	 * 身份证号、姓名、性别
    	 */
        private String id;
        private String name;
        private String sex;
        /*
         * 可选参数
         * 年龄、电话、爱好、住址、学历;
         */
        private int age;
        private String phone;
        private String hobby;
        private String addr;
        private String major;
        /*
         * 让客户端通过利用所有必要的参数调用构造函数得到一个builder对象
         */
        public PersonBuilder(String id,String name,String sex)
        {
        	this.id=id;
        	this.name=name;
        	this.sex=sex;
        }
        /*
         * 调用无参的build方法创建Person对象
         * 注意,在build方法调用前Person对象都没有被创建, 所以无需担心提前泄露的问题
         */
        public Person build()
        {
        	return new Person(this);
        }
        /*
         * 调用类似于setter的方法来设置每个相关的可选参数
         * 这里返回的是PersonBuilder对象,便于用级联的方式
         * 设置可选参数,这样层次清晰,代码简洁
         */
		public PersonBuilder setAge(int age) {
			this.age = age;
			return this;
		}
		public PersonBuilder setPhone(String phone) {
			this.phone = phone;
			return this;
		}
		public PersonBuilder setHobby(String hobby) {
			this.hobby = hobby;
			return this;
		}
		public PersonBuilder setAddr(String addr) {
			this.addr = addr;
			return this;
		}
		public PersonBuilder setMajor(String major) {
			this.major = major;
			return this;
		}
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值