设计模式—构建器模式(Builder Pattern)

Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。比如说现
在有一个类表学生应聘的基本信息。这些信息有一些信息是必须的,比如姓名,身份证号码等,而有许多是可选项,
比如民族、爱好等信息。学生的可选参数可能有20多个以上,这是一个非常的复杂的类了。传统的方法是采用重叠构
造器模式,在这种模式下,你提供第一个只有必要参数的构造器,第二个构造器只有一个可选项,第三个有两个可选
项,依此内推。最后一个构造器包含所有的参数。为了简单起见,接下来的举的例子我们有六个参数,其中,两个必
选参数(姓名、身份证号码),四个可选参数(电话、年龄、地址、邮箱)。

public class Student {
    private String name;
    private String id;
    private String telePhone;
    private int age;
    private String address;
    private String email;
   
    public Student(String name, String id) {
	this(name,id,null);
    }
   
    public Student(String name, String id, String telePhone) {
	this(name,id,telePhone,0);
    }

 
    public Student(String name, String id, String telePhone, int age) {
	this(name,id,telePhone,age,null);
    }

 
    public Student(String name, String id, String telePhone, int age, String address) {
	this(name,id,telePhone,age,address,null);
    }

   
    public Student(String name, String id, String telePhone, int age, String address, String email) {
	super();
	this.name = name;
	this.id = id;
	this.telePhone = telePhone;
	this.age = age;
	this.address = address;
	this.email = email;
    }
    
}
这种实现方式的缺点就是,现在有许多你不想设置的参数时,但是你还不得不去为他们传递值。不想设置的值我们可

以设置为0或者为null,这里面只有六个参数,看起来不是很糟糕,可是当参数愈来愈多时,复杂性是不可想象的。

重叠构造器模式在有许多参数的时候,客户端的代码非常难写,并且不易阅读。

还有一种方式就是JavaBeans模式。在这种模式下,调用一个无参构造器来创建对象,然后调用setter方法来设置每一个必要的参数,以及可选参数。

public class Student {
    private String name;
    private String id;
    private String telePhone;
    private int age;
    private String address;
    private String email;
   
    public Student() {
	super();
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setTelePhone(String telePhone) {
        this.telePhone = telePhone;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}   
相比前面的解决方法,这种方法创建实例很容易,代码可读性较好。但是不足的是,这种方法在构造过程中JavaBeans可能处于不一致的状态。JavaBeans模式阻止了把类做成不可变类的可能。这就需要程序员付出额外的努力去保证它的线程安全。


接下来就是我们今天的主角登场了。欢迎Builder模式(哈哈)!

Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。Builder模


式的要点就是通过一个代理来完成对象的构建过程。这个代理职责就是完成构建的各个步骤,同时它也是易扩展的。

public class Student {
    private String name;
    private String id;
    private String telePhone;
    private int age;
    private String address;
    private String email;

    public static class Builder {
	//必选项
	private String name;
	private String id;
	
	//可选项
	private String telePhone = null;;
	private int age = 0;
	private String address = null;
	private String email = null;
	
	
	public Builder(String name, String id) {
	    super();
	    this.name = name;
	    this.id = id;
	}
	
	public Builder getTelePhone(String telePhone){
	    this.telePhone=telePhone;
	    return this;
	}
	
	public Builder getTAge(int age){
	    this.age=age;
	    return this;
	}
	
	public Builder getAddress(String address){
	    this.address=address;
	    return this;
	}
	
	public Builder getEmail(String email){
	    this.email=email;
	    return this;
	}
	
	public Student build(){
	    return new Student(this);
	}
	

    }
    
    private Student(Builder b){
	telePhone=b.telePhone;
	age=b.age;
	address=b.address;
	email=b.email;
    }
}

客户端调用:

Student stu=new Student.Builder("jiangfeng", "340823").getAddress("武大").getTAge(24).build();
可见,客户端的代码便于编写,易于阅读。,与构造器相比,builder的优势在于,builder可以有多个可变参数。构造器像方法一样,只有一个可变参数。因为builder利用单独的方法来设置每个参数。还有,Builder模式十分灵活,可以利用当个Builder构建多个对象。builder的参数可以在创建对象期间进行调整,也可以随着不同的对象而改变。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值