Android常用设计模式-建造者模式

466 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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()方法。

并且构建者模式的定义并不难,都是一些固定的套路,如果大家有类似的需求,赶快使用起来吧。