作用:帮着构建复杂对象;(如:自定义view)
也称为Builder 模式,可能没写过但一定都见过。
首先是一个非常复杂的对象,虽然构造方法很简单但是它的使用很灵活有很多可配置项。这个时候我们new一个然后看源码一项项去配置明显需要很多功夫。有没有一个方式可以让我们只需要关注到它可以配置的项呢。有,构建者。帮着我们创建复杂的对象。
构建的三种方式:
针对Product类构建
public class Product {
private int id;
private String name;
private int type;
private float price;
}
- 构造器重载
public class Product {
private int id;
private String name;
private int type;
private float price;
public Product(int id) {
this.id = id;
}
。。。
public Product(int id, String name) {
this.id = id;
this.name = name;
}
。。。
public Product(int id, String name, int type) {
this.id = id;
this.name = name;
this.type = type;
}
。。。
public Product(int id, String name, int type, float price) {
this.id = id;
this.name = name;
this.type = type;
this.price = price;
}
}
理论上这种构建方式我们需要生成xxxx非常多的构造方法
- javaBeans方式
public class Product {
private int id;
private String name;
private int type;
private float price;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setType(int type) {
this.type = type;
}
public void setPrice(float price) {
this.price = price;
}
}
相比简单了很多,但是,因为构造过程被分到了几个调用中,在构造过程中JavaBeans可能处于不一致的状态,类无法仅仅通过检验构造器参数的有效性来保证一致性。
- builder模式
public class Product {
private int id;
private String name;
private int type;
private float price;
public Product(Builder builder) {
this.id = builder.id;
this.name = builder.name;
this.type = builder.type;
this.price = builder.price;
}
public static class Builder {
private int id;
private String name;
private int type;
private float price;
public Builder id(int id) {
this.id = id;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Builder type(int type) {
this.type = type;
return this;
}
public Builder price(float price) {
this.price = price;
return this;
}
public Product build() {
return new Product(this);
}
}
}
Product p = new Product.Builder()
.id(10)
.name("phone")
.price(100)
.type(1)
.build();
先通过某种方式取得构造对象需要的所有参数,然后通过这些参数一次性构造这个对象