1、背景
我们当创建对象的时候,碰到需要多个参数的时候,会用什么方法去创见对象呢,尤其是有那种可选参数的时候
2、
1、构造器
使用构造器创建对象,1,2个参数还好,碰到那种可选参数的时候,便得用this 去层层调用参数,指定很多歌构造器,代码量也会很多,new的时候参数一多,也不方便看和理解
2、JavaBean
JavaBean模式对于设置参数提供了大大的方便,但是JavaBean模式下,因为构造过程被分到了几个调用中,在构造中 JavaBean 可能处于不一致的状态。类无法仅仅通过判断构造器参数的有效性来保证一致性。还有一个严重的弊端是,JavaBeans 模式阻止了把类做成不可变的可能。,这就需要我们付出额外的操作来保证它的线程安全。
(这一块说实话理解没有那么深刻)
3、builder模式
builder模式下是建造者模式的一种,它调用构造器来得到一个buider对象,然后调用类似于setter方法来设置每个可选的参数,最后调用无参的对象来生成不可变的对象。这个builder通常是他构建的类的静态成员类
模板如下
public final class Car {
/**
* 必需属性
*/
final String carBody;//车身
final String tyre;//轮胎
final String engine;//发动机
final String aimingCircle;//方向盘
final String safetyBelt;//安全带
/**
* 可选属性
*/
final String decoration;//车内装饰品
public static void main(String[] args) {
Car build = new Car.Builder().safetyBelt(null).build();
System.out.println("hahah");
}
/**
* car 的构造器 持有 Builder,将builder制造的组件赋值给 car 完成构建
* @param builder
*/
public Car(Builder builder) {
this.carBody = builder.carBody;
this.tyre = builder.tyre;
this.engine = builder.engine;
this.aimingCircle = builder.aimingCircle;
this.decoration = builder.decoration;
this.safetyBelt = builder.safetyBelt;
}
public static final class Builder {
String carBody;
String tyre;
String engine;
String aimingCircle;
String decoration;
String safetyBelt;
public Builder() {
this.carBody = "宝马";
this.tyre = "宝马";
this.engine = "宝马";
this.aimingCircle = "宝马";
this.decoration = "宝马";
}
/**
* 实际属性配置方法
* @param carBody
* @return
*/
public Builder carBody(String carBody) {
this.carBody = carBody;
return this;
}
public Builder tyre(String tyre) {
this.tyre = tyre;
return this;
}
public Builder safetyBelt(String safetyBelt) {
if (safetyBelt == null) throw new NullPointerException("没系安全带,你开个毛车啊");
this.safetyBelt = safetyBelt;
return this;
}
public Builder engine(String engine) {
this.engine = engine;
return this;
}
public Builder aimingCircle(String aimingCircle) {
this.aimingCircle = aimingCircle;
return this;
}
public Builder decoration(String decoration) {
this.decoration = decoration;
return this;
}
/**
* 最后创造出实体car
* @return
*/
public Car build() {
return new Car(this);
}
}
}