建造者模式的目的就是将复杂的对象的构造与表示过程分离,以便相同的构造过程可以创建不同的表示。
单纯这样讲可能比较难懂,直接来看下面的例子。

现在有一个people类,由name, gender, region 三个参数,不同people的这几个的值是不一样的。如果不使用builder模式。那么很可能在创建很多对象的时候代码量很多且冗余,而且假如想要创建一个region都是上海的人们,那么就要在每创建一次对象的时候赋值一次,十分不灵活,但是如果使用builder模式,这些问题就都可以得到解决。

下面是一个builder模式的示例代码:

  1. 首先创建一个People.class
public class People {

	String region;
	String name;
	String gender;
	
	public String getRegion() {
		return region;
	}
	public void setRegion(String region) {
		this.region = region;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return getName() + ", " + getGender() + ", " + getRegion() +"人";
	}
}
  1. 创建一个抽象类,Builder,在这个抽象类中实现几个抽象方法,或者也可以将Builder类定义为接口,被后面的方法重写
public abstract class Builder {

	abstract void buildRegion(String region);
	abstract void buildName(String name);
	abstract void buildGender(String gender);
	abstract People build();
}
  1. 接下来就是创建一个继承自Builder抽象类或者是重写Builder接口的BuilderPeople.class
public class BuilderPeople extends Builder{

	People people = new People();
	
	@Override
	void buildRegion(String region) {
		// TODO Auto-generated method stub
		this.people.setRegion(region);
	}

	@Override
	void buildName(String name) {
		// TODO Auto-generated method stub
		this.people.setName(name);
	}

	@Override
	void buildGender(String gender) {
		// TODO Auto-generated method stub
		this.people.setGender(gender);
	}

	@Override
	People build() {
		// TODO Auto-generated method stub
		return people;
	}

}
  1. 工具都准备好了,接下来一步就是把上面的工具组装起来,创建一个Director类,在这里就可以给前面的变量赋值,也可以等到后面调用Director的时候赋值
public class Director {

	Builder builder;
	
	public Director(Builder builder) {
		// TODO Auto-generated constructor stub
		this.builder = builder;
	}
	
	public void Director(String name, String region, String gender) {
		builder.buildGender(gender);
		builder.buildName(name);
		builder.buildRegion(region);
	}
}
  1. 使用.创建Test.class
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		BuilderPeople builder= new BuilderPeople();
		Director director = new Director(builder);
		director.Director("姚明", "上海", "男");
		People people = builder.build();
		
		System.out.println(people.toString());
	}
}

只需要调用Builder.class中的build方法,就可以生成一个People对象。

输出结果:

java中builder模式创建对象 builder java_java

这里就可以看出来,想要构建几个BuilderPeople.class对象都只要在这里调用build方法就可以生成, 并且这其中的属性都可以自由添加。

假如现在我们不想构建BuilderPeople对象,假如构建一个更加庞大的群体,比如说上海人,那就是People中的region属性都要赋值为“上海”,前面说过,这是builder模式的便利之处,可以当很多个对象都有同样的属性时,统一赋值

下面创建一个ShangHaiDirector.class,在这个类里对region赋值为“上海”

public class ShangHaiDirector {

Builder builder;
	
	public ShangHaiDirector(Builder builder) {
		// TODO Auto-generated constructor stub
		this.builder = builder;
	}
	
	public void ShangHaiDirector(String name, String gender) {
		builder.buildGender(gender);
		builder.buildName(name);
		builder.buildRegion("上海");
	}
	
}

Test.class调用

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		BuilderPeople p = new BuilderPeople();
		Director director = new Director(p);
		director.Director("姚明", "男");
		
		People people = p.build();
		
		System.out.println(people.toString());
//		BuilderPeople p2 = new BuilderPeople().
	}

}

运行结果和上面是一样的,但是这样几避免了当有大量对象需要构造的时候重复赋值的问题。

.
.
.