标签(空格分隔): android 设计模式 builder
1 Builder设计模式概述
将复杂对象的构建与它的表示分离,使得同样的构建过程可以产生不容的表示。即通过一个专门的Builder的对象来构建新的对象。
2 使用场景
- 一般用于复杂对象的构建。
例如,网络访问的对象需要传入多个参数,将参数类型设置为一个Config类,构建Config类的对象就可以使用Builder类。
3 三种构建对象方式的比较
3.1 通过构造函数传入
坏处:参数多的时候,编写代码的人要当心传错参数,查看代码的人不太容易理解传入参数的含义。不方便维护。即使是分多个构造函数传入不同的参数也是一样。
3.2 通过setter挨个构造
好处:易于阅读,并且可以只对有用的成员变量赋值;
缺点:
不能使用final类型
用户可能拿到不完整的对象。
3.3 Builder方式构造
- 1内容:
在要构建的类的内部创建一个静态内部Builder类
该静态内部类的字段与要创建的类保持一致
Builder类的构造方法传入初始化必须的参数(final类型)
Builder类提供setter方法,返回自身this
要构建的类的构造方法传入Builder类的实例
Builder类提供build方法,调用要构建的类的构造方法,返回要构建的类的实例。
- 2核心思想:
变种 Builder 模式目的在于减少对象创建过程中引入的多个构造函数、可选参数以及多个 setter 过度使用导致的不必要的复杂性。同时某些参数如果用户没有设置,可以有默认值。
- 3好处:
链式调用,优雅好看
先赋值,后创建对象,保证对象的完整性。
- 4代码:
public class Person {
//固定不变的对象,一般变量需要声明为 final
private final String mName; //必选,final 类型需要在 构造器中初始化,不允许不初始化它的构造器存在
private String mLocation; //可选
private String mJob; //可选
private String mHabit; //可选
/**
* 构造方法的参数是它的 静态内部类,使用静态内部类的变量一一赋值
* @param builder
*/
public Person(Builder builder) {
this.mName = builder.mName;
this.mLocation = builder.mLocation;
this.mJob = builder.mJob;
this.mHabit = builder.mHabit;
}
/**
* Person 的静态内部类,成员变量和 Person 的一致
*/
public static class Builder{
private final String mName; //必选,final 类型需要在 构造器中初始化,不允许不初始化它的构造器存在
private String mLocation; //可选
private String mJob; //可选
private String mHabit; //可选
/**
* 含必选参数的构造方法
* @param name
*/
public Builder(String name) {
mName = name;
}
public Builder setLocation(String location) {
mLocation = location;
return this;
}
public Builder setJob(String job) {
mJob = job;
return this;
}
public Builder setHabit(String habit) {
mHabit = habit;
return this;
}
/**
* 最终构建方法,返回一个 PersonTree 对象,参数是当前 Builder 对象
* @return
*/
public PersonThree build(){
return new Person(this);
}
}
}
- 5技巧:
下载AS插件 Inner Builder,写好要构建的类的字段之后,直接 Generate构造Buidler
4 实际案例
android中的AlertDialog对象就是使用Builder模式来构建的。
new AlertDialog.Builder(self)
.setTitle("标题")
.setMessage("简单消息框")
.setPositiveButton("确定", null)
.show();