java创建对象的优化:Builders模式

来源:互联网 发布:与知乎类似 编辑:程序博客网 时间:2024/05/21 18:41

一般来说,我们创建对象都是使用该类的构造器来创建,而且我们通过客户端所提供的参数来选用对应的构造器来创建对象。我们还可以通过javabean类似的方法,使用无参构造器创建对象,然后通过set方法来为该对象的成员变量进行赋值。我们也可以通过一种Builders模式来创建对象。现在来介绍这三种方法。

1、使用重载构造器来创建类的对象,这种办法的安全性很高,不过他的可读性很低,因为我们刚开始创建的构造器虽然满足了根据参数的个数来创建对应的构造器,可是我们还是无法避免创建对象的时候为不必要的参数进行赋值的问题,这样一来可读性大大降低,而且如果该类的参数很多的话,我们就可能会因为创建一个对象来为很多的不必要的参数进行赋值

2.使用javabeans模式创建类的对象,这种办法解决了重载构造器的缺点,因为我们刚开始创建的对象并没有为其成员变量赋值,我们可以接下来使用set方法来为我们需要赋值的成员变量进行赋值。不过它的缺点较为严重,因为构造的过程被分到了多个调用中,调用构造器和调用多个set方法,这样一来在构造过程中javabean可能处于不一致的状态,类无法仅仅通过检验构造器参数的有效性来保证一致性,还有一个缺点在于,javabeans模式阻止了把类变成不可变的可能,因为我们随时可以通过set方法来改变类的对象的成员变量。

3.Builders模式,能保证像重载构造器那样的安全性,也具有javabeans模式那么好的可读性。它不直接创建builder对象,而是让客户端在builder对象上调用类似于set的方法来设置相关的参数,最后客户端调用无参数的build方法来生成不可变的对象。该模式主要分为以下几步:
1.创建外部类的静态成员类Builder,该成员类的成员变量的个数和类型同外部类,为该成员类创建一个构造器,该构造器的参数仅仅包括索要创建的类的必须参数,也可以是一个无参构造器;
2.为该成员类提供多个类似于set方法的方法,其方法名同索要set的成员变量的名称,但是返回的值的类型为Builder,返回值为this,这样一来,该方法返回的值仍然可以继续调用这种类型的方法来一次性为this赋值
3.为该成员类提供一个builder方法,该方法调用外部类的构造器,外部类的构造器只有一个参数,就是Builder对象,this,然后在该构造器里将两个类的成员变量对应赋值。

4.Builders模式示例:

“`
public class outsideClass {

private final int intParam ;private final float floatParam ;private final double doubleParam ;private final String strParam ;public static class Builder {    //required parameters     private final int intPram ;    private final float floatParam ;    //Optional paramters' default values    private final double doubleParam ;    private final String strParam ;    public Builder(int arg0,float arg1) {        this.intParam = arg0 ;        this.floatParam = arg1 ;    }    public Builder doubleParam(double arg0){        doubleParam = arg0 ;        return this;    }    public Builder strParam(String arg0){        strParam = arg0 ;        return this;    }    public outsideClass builder() {        return new outsideClass(this) ;    }}public outsideClass(Builder builder) {    this.intParam = builder.intParam ;    this.floatParam = builder.floatParam ;    this.doubleParam = builder.doubleParam ;    this.strParam = builder.strParam ; }

}

Builders模式也有不足之处,它比重载构造器模式代码更加长,因此它只在有很多参数的情况下才使用。

0 0