本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Android中的建造者模式
如果说单例模式是对性能有提升,那么建造者模式并没有对性能有什么变化。这种设计模式只是一种创建型的模式,只是对创建对象的优化与简化。
建造者模式的在Android中是很常用的,很多API都是通过建造者模式构建的
AlertDialog:
AlertDialog.Builder builder=new AlertDialog.Builder(this);
AlertDialog dialog=builder.setTitle("Title")
.setIcon(android.R.drawable.ic_dialog)
.setMessage("Content")
.setPositiveButton(R.string.positive, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton(R.string.negative, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.create();
dialog.show();
OkHttp:
Request.Builder builder=new Request.Builder();
Request request=builder.addHeader("","")
.url("")
.post(body)
.build();
Gson :
GsonBuilder builder=new GsonBuilder();
Gson gson=builder.setPrettyPrinting()
.disableHtmlEscaping()
.generateNonExecutableJson()
.serializeNulls()
.create();
看到这里我们都应该知道怎么使用了,那我们为什么要使用建造者模式?那我们又该如何定义一个自己的构建者模式呢?
一个对象中的属性
public class Person {
private String name;
private int age;
private double height;
private double weight;
...get set
}
例如我们需要给某些字段赋值,某些字段不赋值,某些字段必须赋值。如何操作呢?有些人说可以通过构造方法。
public Person() {
}
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, double height) {
this.name = name;
this.age = age;
this.height = height;
}
当然构造方法是可以的,但是一旦字段多了之后,维护起来是非常庞大的代码,并且并不适合别人来使用,当你看到10个构造方法之后你一样懵逼。
其实我们就可以通过建造者模式来创建了,如何使用往下看。
固定的模板使用,给当前类类添加一个静态Builder类,然后修改Person的构造函数:
public class Person {
private String name;
private int age;
private double height;
private double weight;
privatePerson(Builder builder) {
this.name=builder.name;
this.age=builder.age;
this.height=builder.height;
this.weight=builder.weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
static class Builder{
private String name;
private int age;
private double height;
private double weight;
//注意,如果是必填的通过构造方式,如果是非必填可以通过下面的方式定义
public Builder(String name){
this.name = name;
}
public Builder age(int age){
this.age=age;
return this;
}
public Builder height(double height){
this.height=height;
return this;
}
public Builder weight(double weight){
this.weight=weight;
return this;
}
public Person build(){
return new Person(this);
}
}
}
使用:
new Person.Builder("张三"); //必填name,通过构造的方式定义
.age(18) //非必填的 通过set方法定义
.height(178.5)
.weight(67.4)
.build();
这样通过建造者模式创建对象,语义很明确,非常的优雅,可读性很强,并且非常的灵活。
如果有需求还可以对传入的参数进行校验,当参数不满足校验的时候 throw new IllegalStateException
总结
当我们的类中有很多属性的时候,重要的是它有很多可选属性的时候,我们就可以使用builder建造者模式来创建,因为这样不仅可以使我们的类使用起来很优雅,而且还可以给我们的对象一个创建完成的标识,即build()方法。
并且构建者模式的定义并不难,都是一些固定的套路,如果大家有类似的需求,赶快使用起来吧。