1.关于Builder模式
Builder模式是一种广泛使用的设计模式,在设计模式中,对其的解释大致为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
应用场景
在以下情况使用Build模式:
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同的表示时。
Builder模式要解决的也正是这样的问题:
- 当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成)
- 我们要复杂对象的创建过程和这个对象的表示(展示)分离开来。
这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
2.Builder模式在Java中的简析
在Java中常见的Builder模式大致有4个参与者,分别为:
- Product:待被构造的复杂对象;
- Builder:抽象接口,用于创建Product的各个组成部分;
- ConcreteBuilder:Builder接口的具体实现;
- Director:Builder接口的使用者
代码示例
Product类
public class AppInfo {
private String name;
private int versionCode;
private String versionName;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getVersionCode() {
return versionCode;
}
public void setVersionCode(int versionCode) {
this.versionCode = versionCode;
}
public String getVersionName() {
return versionName;
}
public void setVersionName(String versionName) {
this.versionName = versionName;
}
}
Builder接口
public interface Builder {
public void builderName(String name);
public void builderVersionCode(int versionCode);
public void builderVersionName(String versionName);
public AppInfo getAppInfo();
}
Builder接口的具体实现
public class AppInfoBuilder implements Builder {
AppInfo appInfo;
public AppInfoBuilder() {
appInfo = new AppInfo();
}
@Override
public AppInfo getAppInfo() {
return appInfo;
}
@Override
public void builderName(String name) {
appInfo.setName(name);
}
@Override
public void builderVersionCode(int versionCode) {
appInfo.setVersionCode(versionCode);
}
@Override
public void builderVersionName(String versionName) {
appInfo.setVersionName(versionName);
}
}
Builder接口的使用者
public class AppInfoDirector {
private Builder builder;
public AppInfoDirector(Builder builder) {
this.builder = builder;
}
public void builderAppInfo(String name, int versionCode, String versionName) {
builder.builderName(name);
builder.builderVersionCode(versionCode);
builder.builderVersionName(versionName);
}
public AppInfo getAppInfo() {
return builder.getAppInfo();
}
}
到此为止大致就是在Java中使用Builder模式的流程。在开发中,具体的使用方式会因开发人员对该模式的理解产生些许变化。下面则将重点介绍如何在android中使用Builder模式。
3.android下的Builder模式
Java中的Builder模式重点在于抽象出对象创建的步骤,并通过调用不同的具体实现从而得到不同的结果,而android下Builder模式的目的在于减少对象创建过程中的多个重载构造函数、可选参数以及由setter方法过度使用而导致的不必要的复杂性。
下面我们将先简单看下android官方提供的代码示例,然后在已一个简单对象(AppInfo)为列进行分析。
官方示例
AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle("title")
.setMessage("message")
.setCancelable(false)
.setPositiveButton(
"positiveButton",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
}
)
.setNegativeButton(
"negativeButton",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
}
)
.create();
alertDialog.show();
可以看出在创建AlertDialog对象时,使用的就是Builder模式,整个创建过程非常的简洁,下面我们则将对AppInfo对象进行改造,使其支持类似的Builder模式。
改造AppInfo对象
public class AppInfo {
private final String name;//必填字段
private int versionCode;
private String versionName;
private String desption;
private String author;
private String company;
private AppInfo(Builder builder) {
//通过Builder进行赋值
name = builder.name;
versionCode = builder.versionCode;
versionName = builder.versionName;
desption = builder.desption;
author = builder.author;
company = builder.company;
}
public String getName() {
return name;
}
public int getVersionCode() {
return versionCode;
}
public String getVersionName() {
return versionName;
}
public String getDesption() {
return desption;
}
public String getAuthor() {
return author;
}
public String getCompany() {
return company;
}
@Override
public String toString() {
return "AppInfo{" +
"name='" + name + '\'' +
", versionCode=" + versionCode +
", versionName='" + versionName + '\'' +
", desption='" + desption + '\'' +
", author='" + author + '\'' +
", company='" + company + '\'' +
'}';
}
public static final class Builder {
private final String name;
private int versionCode;
private String versionName;
private String desption;
private String author;
private String company;
public Builder(String val) {
//必填字段通过构造函数进行赋值
name = val;
}
public Builder versionCode(int val) {
versionCode = val;
return this;
}
public Builder versionName(String val) {
versionName = val;
return this;
}
public Builder desption(String val) {
desption = val;
return this;
}
public Builder author(String val) {
author = val;
return this;
}
public Builder company(String val) {
company = val;
return this;
}
public AppInfo build() {
return new AppInfo(this);
}
}
}
从以上代码中可以发现如下几点:
- AppInfo类的构造函数是私有的,所以调用者不能直接实例化这个类。
- AppInfo类是不可变的,所有必选属性值都是final的并且在构造函数中设置;同时属性值只提供getter方法。
- Builder的构造函数只接收必选属性作为参数,并且只有必选属性值设置为final,以此保证它们在构造函数中设置。
最后,AppInfo类的使用方式如下:
AppInfo appInfo = new AppInfo.Builder("builder测试").author("wlei")
.versionCode(1)
.versionName("第一版")
.company("cloverstudio")
.desption("android中的Builder模式")
.build();
以上便是本人对Builder模式在android中的使用方式的简单总结,感谢您的阅读。