设计模式之建造者模式(Builder)

builder模式也叫建造者模式,builder模式的作用将一个复杂对象的构建与他的表示分离,使用者可以一步一步的构建一个比较复杂的对象。

Java 建造中模式示例

我们通常构造一个有很多参数的对象时有三种方式:构造器重载,JavaBeans模式和builder模式。通过一个小例子我们来看一下builder模式的优势。

构造器重载方式

public class User {
	private String name;
	private String pwd;
	private int age;
	public User(String name)
	{
		this.name = name;
	}
	public User(String name, String pwd)
	{
		this.name = name;
		this.pwd = pwd;
	}
	public User(String name, String pwd, int age)
	{
		this.name = name;
		this.pwd = pwd;
		this.age = age;
	}
}

使用构造器重载我们需要定义很多构造器,为了应对使用者不同的需求(有些可能只需要name,有些需要pwd和name,......),这样如果参数更多的话,那将是指数级增长,肯定是不合理的,那如何改进了?

public class User {
	private String name;
	private String pwd;
	private int age;
	public String getName() {
		return name;
	}
	public String getPwd() {
		return pwd;
	}
	public int getAge() {
		return age;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

我们对所有参数都加get、set方法,这样我们的构造方法就不用写,参数增加一个,我们只有get、set方法就行了,很方便!

这种方式弥补了构造器重载的不足,创建实例很容易,代码读起来也很容易。但是,因为构造过程被分到了几个调用中,在构造过程中JavaBeans可能处于不一致的状态,类无法仅仅通过检验构造器参数的有效性来保证一致性。

使用Builder模式

public class User {
	private String name;
	private String pwd;
	private int age;
	public User(Builder builder)
	{
		this.name = builder.name;
		this.pwd = builder.pwd;
		this.age = builder.age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public static class Builder
	{
		private String name;
		private String pwd;
		private int age;

		public Builder name(String name)
		{
			this.name = name;
			return this;
		}
		public Builder pwd(String pwd)
		{
			this.pwd = pwd;
			return this;
		}
		public Builder age(int age)
		{
			this.age = age;
			return this;
		}
		public User builder()
		{
			return new User(this);
		}
	}
	public static void main(String[] args)
	{
		User user = new Builder()
				.name("pangugle")
				.pwd("pwd")
				.age(1)
				.builder();
	}
}

现在就完美了!