引用了
用途
用于解決以下這種情況,參數(shù)很多,但是并不是都需要窒舟,①于是你選擇寫(xiě)出很多構(gòu)造函數(shù)衡载,②或者一次性讓使用者輸入很多參數(shù),這些參數(shù)中很多為null。③這個(gè)時(shí)候就需要建造者builder模式。
public class Person {
private final String firstName;
private final String lastName;
private final String middleName;
private final int age;
private final String street;
private final String district;
private final String city;
private final String province;
private final boolean isFemale;
private final boolean isEmployed;
public Person(String firstName, String lastName, String middleName, int age, String street,
String district, String city, String province, boolean isFemale, boolean isEmployed) {
this.firstName = firstName;
this.lastName = lastName;
this.middleName = middleName;
this.age = age;
this.street = street;
this.district = district;
this.city = city;
this.province = province;
this.isFemale = isFemale;
this.isEmployed = isEmployed;
}
@Override
public String toString() {
return "Person{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", middleName='" + middleName + '\'' +
", age=" + age +
", street='" + street + '\'' +
", district='" + district + '\'' +
", city='" + city + '\'' +
", province='" + province + '\'' +
", isFemale=" + isFemale +
", isEmployed=" + isEmployed +
'}';
}
}
代碼示例
HttpClient_4.3中部分源碼
/**
* builder pattern
* @author Ricky Feng
* @version 2015-02-27 10:42
*/
public class IvrConfig {
private final String apiKey;
private final String secret;
private final int interval;
private final File ivrFileDir;
IvrConfig(final String apiKey,final String secret,final int interval,final File ivrFileDir){
this.apiKey = apiKey;
this.secret = secret;
this.interval = interval;
this.ivrFileDir = ivrFileDir;
}
public String getApiKey() {
return apiKey;
}
public String getSecret() {
return secret;
}
public int getInterval() {
return interval;
}
public File getIvrFileDir() {
return ivrFileDir;
}
/**create Builder method**/
public static IvrConfig.Builder custom() {
return new Builder();
}
@Override
public String toString() {
return "IvrConfig [apiKey=" + apiKey + ", secret=" + secret
+ ", interval=" + interval + ", ivrFileDir=" + ivrFileDir + "]";
}
public static class Builder {
private String apiKey;
private String secret;
private int interval;
private File ivrFileDir;
Builder(){
this.apiKey = "null";
this.secret = "null";
this.interval = -1;
this.ivrFileDir = new File("./");
}
public Builder setApiKey(final String apiKey) {
this.apiKey = apiKey;
return this;
}
public Builder setSecret(final String secret) {
this.secret = secret;
return this;
}
public Builder setinterval(final int interval) {
this.interval = interval;
return this;
}
public Builder setIvrFileDir(final File ivrFileDir) {
this.ivrFileDir = ivrFileDir;
return this;
}
public IvrConfig build(){
return new IvrConfig(apiKey, secret, interval, ivrFileDir);
}
}
}
IvrConfig config = IvrConfig.custom().setApiKey("abc").setSecret("bb").build();
System.out.println(config);
另外一種寫(xiě)法
public class PermissionAsker {
private Activity activity;//activity
private Fragment fragment;//fragment
private OnAskAppearListener listener;//申請(qǐng)權(quán)限時(shí)要執(zhí)行的事件
private String[] permissions;//權(quán)限
private int permissionCode;//權(quán)限申請(qǐng)碼,不同權(quán)限憎茂,不能沖突
private int activityCode;//設(shè)置界面權(quán)限申請(qǐng)碼,不同權(quán)限不能沖突
private String askReason;//權(quán)限跳轉(zhuǎn)提示語(yǔ)句
private boolean must;
private AlertDialog alertDialog;
private boolean isAsking;
/**
* 構(gòu)造一個(gè)asker
* @param activity activity
* @param listener 申請(qǐng)權(quán)限時(shí)要執(zhí)行的事件
* @param permisstions 權(quán)限
* @param permissionCode 權(quán)限申請(qǐng)的requestCode
* @param activityCode 跳轉(zhuǎn)到設(shè)置界面的requestCode
* @param askReason 是否彈出dialog跳轉(zhuǎn)到權(quán)限設(shè)置
*/
public PermissionAsker(Activity activity, Fragment fragment, OnAskAppearListener listener, String[] permisstions, int permissionCode, int activityCode, String askReason, boolean must){
this.activity = activity;
this.fragment = fragment;
this.listener = listener;
this.permissions = permisstions;
this.permissionCode = permissionCode;
this.activityCode = activityCode;
this.askReason = askReason;
this.must = must;
}
public static class Builder{
private Activity activity;
private Fragment fragment;
private OnAskAppearListener listener;
private String[] permissions;
private int permisstionCode;
private int activityCode;
private String askReason;
private boolean must;
public Builder(){
}
public Builder setActivity(Activity activity) {
this.activity = activity;
return this;
}
public Builder setFragment(Fragment fragment){
this.fragment = fragment;
return this;
}
public Builder setListener(OnAskAppearListener listener) {
this.listener = listener;
return this;
}
public Builder setPermissions(String[] permissions) {
this.permissions = permissions;
return this;
}
public Builder setPermisstionCode(int permisstionCode) {
this.permisstionCode = permisstionCode;
return this;
}
public Builder setActivityCode(int activityCode) {
this.activityCode = activityCode;
return this;
}
public Builder setAskReason(String askReason) {
this.askReason = askReason;
return this;
}
public Builder setMust(boolean must){
this.must = must;
return this;
}
public PermissionAsker build(){
return new PermissionAsker(activity, fragment, listener, permissions, permisstionCode, activityCode, askReason, must);
}
}
}
initAsker = new PermissionAsker.Builder()
.setActivity(this)
.setActivityCode(2)
.setPermisstionCode(2)
.setAskReason("為了測(cè)試锤岸,我們需要你的這些權(quán)限")
.setPermissions( new String[]{
Manifest.permission.RECORD_AUDIO,
Manifest.permission.CAMERA
})
.setMust(true)
.setListener(new OnAskAppearListener() {
@Override
public void onAppear() {
Toast.makeText(MainActivity.this, "成功啦", Toast.LENGTH_SHORT).show();
}
})
.build();