2:处理多个构造函数参数(重点是Builder模式)

静态工厂方法和构造函数有相同的局限性:当构造的对象有多个函数时候,编写都不方便。

最常用的方法是使用多个构造,不同的构造函数使用不同的参数。这种方式是可行的,但是客户端代码会难以编写,并且难以阅读。

另一种方法是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);
}

}

这种方法唯一的不足就是创建对象的时候需要首先创建构造器,这会影响程序的性能。

posted @ 2009-08-07 05:47  macula7  阅读(116)  评论(0编辑  收藏  举报