Builder设计模式同Abstract Factory一样,均属于构造对象之类。但是Builder对象一般用于对象较为复杂,需要一步步构建的情况。比如造一辆汽车,可能会牵扯到一些零件,而这些零件又会分配给不同的工厂去构建,等所有的零件都创造好了之后,再进行最后的组装,这个时候就可以使用Builder模式了。
另外还有一个比较常见的情况是,一个对象的状态比较复杂,假如让客户端直接调用该对象的构造函数然后传递一些参数值的话又显得过于啰嗦(通常参数会多于4个)这个时候可以使用Builder对象,实现优雅地创建对象。Builder为这个对象的内部类。
例如我们熟悉的android Dialog就使用了builder模式
比如我写一个比较简单的Person类:(假设这个Person的创建过程比较复杂)
package net.liuyx.test;
public class Person {
private String name;
private int age;
private String gender;
private String career;//职业
private long salary; //月薪
private int height;
private boolean handsome;//帅不帅
public Person(String name, int age, String gender, String career,
long salary, int height, boolean handsome) {
this.name = name;
this.age = age;
this.gender = gender;
this.career = career;
this.salary = salary;
this.height = height;
this.handsome = handsome;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender
+ ", career=" + career + ", salary=" + salary + ", height="
+ height + ", handsome=" + handsome + "]";
}
}
假如直接调用构造器创建这个Person对象,是不是感觉很繁琐呢。
那么此时,使用Builder对象就会比较优雅,见代码:
package net.liuyx.test;
public class Person {
private static String name;
private static int age;
private static String gender;
private static String career;// 职业
private static long salary; // 月薪
private static int height;
private static boolean handsome;// 帅不帅
public static class Builder {
final Person p = new Person();
//为某些不存在的属性提供默认实现
Builder() {
name = "张三";
age = 23;
gender = "man";
career = "IT";
salary = 50000;
height = 180;
handsome = true;
}
//一步步地构造子类
public void setName(String name) {
p.name = name;
}
public void setAge(int age) {
p.age = age;
}
public void setGender(String gender) {
p.gender = gender;
}
public void setCareer(String career) {
p.career = career;
}
public void setSalary(long salary) {
p.salary = salary;
}
public void setHeight(int height) {
p.height = height;
}
public void setHandsome(boolean handsome) {
p.handsome = handsome;
}
//最后会返回一个最终的类对象
public Person getFinalPerson(){
return p;
}
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender
+ ", career=" + career + ", salary=" + salary + ", height="
+ height + ", handsome=" + handsome
+ "]";
}
public static void main(String[] args){
Builder builder = new Person.Builder();
Person p = builder.getFinalPerson();
System.out.println(p);
builder.setName("wangjianwei");
Person p2 = builder.getFinalPerson();
System.out.println(p2);
}
}
输出:
Person [name=张三, age=23, gender=man, career=IT, salary=50000, height=180, handsome=true]
Person [name=wangjianwei, age=23, gender=man, career=IT, salary=50000, height=180, handsome=true]