Builder模式:将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
什么时候可以使用builder模式:
1、一个类中有很多个属性,并且很多属性都有可能在创建对象的时候初始化。
2、相同的方法,不同的执行顺序,产生不同的事件结果时
3、多个部件或零件,都可以装配到一个对象中,但是产生的运行效果又不相同时
4、产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常合适
Android builder模式的特点:
1、Android builder模式是变种的builder模式,减少了对象创建过程中引用的多个重载构造方法。
2、使用builder模式的类,构造方法是私有的。
3、使用builder模式的类是不可变的,对外只提供getter方法或者连getter方法都不提供。
实现步骤:
1、定义属性:属性可用final修饰,必须要初始化的属性需要在定义的builder类中的构造函数中传递参数初始化。
2、定义一个builder类:一般是一个内部类,builder类中有外部类的所有属性。
3、外部类构造函数私有化,并且构造函数中的参数为builder类对象,并且在构造函数中初始化所有的成员属性。
4、所有需要设置的属性值,在内部类builder中设置,并且返回builder类本身。
4、builder类提供外部类实例对象。
public class User {
private final String name;//必选属性:必须赋值 builder类构造函数中赋值
private int age;
private String address;
private User(Builder builder) {
//初始化变量
this.name = builder.name;
this.age = builder.age;
this.address = builder.address;
}
static class Builder {
//与外部类User成员属性一致
private final String name;
private int age;
private String address;
public Builder(String name) {
this.name = name;//必选属性
}
public Builder setAge(int age) {
this.age = age;
return this;
}
public Builder setAddress(String address) {
this.address = address;
return this;
}
//提供外部类实例对象
public User create() {
//在创建实例的时候再对属性的合理性做判断,不必在设置的时候判断
if (age <= 0) {
throw new RuntimeException("年龄不合法");
}
return new User(this);
}
}
}
//使用
public class DemoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_demo);
User user = new User.Builder("UserName")
.setAge(18)
.setAddress("China")
.create();
}
}