建造者模式的目的就是将复杂的对象的构造与表示过程分离,以便相同的构造过程可以创建不同的表示。
单纯这样讲可能比较难懂,直接来看下面的例子。
现在有一个people
类,由name, gender, region
三个参数,不同people的这几个的值是不一样的。如果不使用builder模式。那么很可能在创建很多对象的时候代码量很多且冗余,而且假如想要创建一个region
都是上海的人们,那么就要在每创建一次对象的时候赋值一次,十分不灵活,但是如果使用builder模式,这些问题就都可以得到解决。
下面是一个builder模式的示例代码:
- 首先创建一个
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() +"人";
}
}
- 创建一个抽象类,
Builder
,在这个抽象类中实现几个抽象方法,或者也可以将Builder
类定义为接口,被后面的方法重写
public abstract class Builder {
abstract void buildRegion(String region);
abstract void buildName(String name);
abstract void buildGender(String gender);
abstract People build();
}
- 接下来就是创建一个继承自
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;
}
}
- 工具都准备好了,接下来一步就是把上面的工具组装起来,创建一个
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);
}
}
- 使用.创建
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对象。
输出结果:
这里就可以看出来,想要构建几个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().
}
}
运行结果和上面是一样的,但是这样几避免了当有大量对象需要构造的时候重复赋值的问题。
.
.
.