静态工厂方法和构造函数有相同的局限性:当构造的对象有多个函数时候,编写都不方便。
最常用的方法是使用多个构造,不同的构造函数使用不同的参数。这种方式是可行的,但是客户端代码会难以编写,并且难以阅读。
另一种方法是JavaBean模式,即对每个属性都提供set和get方法,这样来对属性进行控制。但是该模式的局限性在于该模式不能保证一致性。原因是对象的构造过程被分到了几个不同的调用中,这就有可能会产生不一致状态的对象导致程序的失败。需要付出额外的努力来保持线程安全。
有一种更好的解决方案是Builer模式。看下面的例子:
package test;
/*
* 该类用来演示Builder模式
*/
public class Date1 {
private final int year;
private final int month;
private final int day;
/*
* 静态内部类用于构建外部对象,该类称为构造器
*/
public static class Builder{
private int year;
private int day;
private int month;
public Builder(int year){
this.year=year;
}
/*
* 方法用来设置属性值,返回值类型为该类的对象
*/
public Builder month(int month){
this.month=month;
return this;
}
public Builder day(int day){
this.day=day;
return this;
}
/*
* 通过内部类对象构建外部类对象
*/
public Date1 build(){
return new Date1(this);
}
}
/*
* 外部类构造函数,参数为静态内部类
*/
private Date1(Builder builder){
year=builder.year;
month=builder.month;
day=builder.day;
}
@Override
public String toString(){
return "year:"+year+" month:"+month+" day:"+day;
}
public static void main(String[] args) {
Date1 date=new Date1.Builder(2008).month(8).day(8).build();//这样就能使用一个语句来创建对象,并且能够明确的定义各个属性值
System.out.println(date);
}
}
这种方法唯一的不足就是创建对象的时候需要首先创建构造器,这会影响程序的性能。