由于标准版的建造者模式我目前还没用过(或者见过我没认出来==),这里只说一种特殊的建造者模式,它适用于当一个类构造器需要传入很多参数时,如果使用构造函数创建这个类的实例,代码可读性会非常差,而且很容易引入错误,此时就可以利用 builder模式 :
public class Person
{
private String eyes;
private String nose;
private String mouth;
private String ears;
private String hair;
/**
* @param builder
*/
public Person(Builder builder)
{
this.eyes = builder.eyes;
this.nose = builder.nose;
this.mouth = builder.mouth;
this.ears = builder.ears;
this.hair = builder.hair;
}
@Override
public String toString()
{
return "Person [eyes=" + eyes + ", nose=" + nose + ", mouth=" + mouth + ", ears=" + ears + ", hair=" + hair
+ "]";
}
public static final class Builder
{
private String eyes;
private String nose;
private String mouth;
private String ears;
private String hair;
public Builder()
{}
public Builder eyes(String eyes)
{
this.eyes = eyes;
return this;
}
public Builder nose(String nose)
{
this.nose = nose;
return this;
}
public Builder mouth(String mouth)
{
this.mouth = mouth;
return this;
}
public Builder ears(String ears)
{
this.ears = ears;
return this;
}
public Builder hair(String hair)
{
this.hair = hair;
return this;
}
public Person build()
{
return new Person(this);
}
}
}
public class Client
{
public static void main(String[] args)
{
Person xiaoming = new Builder()
.eyes("大眼睛")
.nose("小鼻子")
.mouth("大嘴巴")
.ears("小耳朵")
.hair("红头发")
.build();
System.out.println(xiaoming.toString());
}
}
这样的建造者模式更加灵活,非常使用于参数很多的状况,而且我们可以在builder的每个赋值方法中对参数进行校验。如果这些操作在实体对象本身的构造函数中校验呢?想都不敢想会是什么后果。
这种形式的建造者模式最常见肯定是在netty中莫属了。