一、問(wèn)題示例
public void func(String name, String id, String gender, String fullname, long time, boolean flag, Object body){
//具體業(yè)務(wù)
}
可以看到該方法參數(shù)多達(dá)七個(gè),并且前四個(gè)都是String類型,使用者很容易在傳入?yún)?shù)的時(shí)候搞錯(cuò)順序。
二、解決辦法
使用建造者模式構(gòu)建一個(gè)Params類,用來(lái)管理所有的入?yún)ⅰ4a結(jié)構(gòu)如下:
public class Params {
private String name;
private String id;
private String gender;
private String fullname;
private long time;
private boolean flag;
private Object body;
public String getName() {
return name;
}
public String getId() {
return id;
}
public String getGender() {
return gender;
}
public String getFullname() {
return fullname;
}
public long getTime() {
return time;
}
public boolean isFlag() {
return flag;
}
public Object getBody() {
return body;
}
private Params(String name, String id, String gender, String fullname,
long time, boolean flag, Object body) {
this.name = name;
this.id = id;
this.gender = gender;
this.fullname = fullname;
this.time = time;
this.flag = flag;
this.body = body;
}
public static class Builder{
private String name;
private String id;
private String gender;
private String fullname;
private Long time;
private Boolean flag;
private Object body;
private Builder(){
}
public static Builder build(){
return new Builder();
}
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setId(String id) {
this.id = id;
return this;
}
public Builder setGender(String gender) {
this.gender = gender;
return this;
}
public Builder setFullname(String fullname) {
this.fullname = fullname;
return this;
}
public Builder setTime(long time) {
this.time = time;
return this;
}
public Builder setFlag(boolean flag) {
this.flag = flag;
return this;
}
public Builder setBody(Object body) {
this.body = body;
return this;
}
public Params create(){
if (name != null && gender != null && flag != null && id != null) {
return new Params(name, id, gender, fullname, time, flag, body);
} else {
return null;
}
}
}
}
該代碼和一般的建造者模式不同在于:
1.對(duì)于long等基本類型,在Builder類的成員變量中全都使用其包裝類。其作用在于識(shí)別用戶是否執(zhí)行了Builder中的setXxxx()接口。
2.對(duì)于所有必傳參數(shù),在Builder類的create()方法中檢測(cè)是否為null,檢測(cè)構(gòu)建過(guò)程中是否使用了必須的setXxxx()接口。
3.所有的類的構(gòu)造函數(shù)都私有化,防止用戶直接創(chuàng)建,繞過(guò)檢測(cè)。
4.func方法需要修改成如下方式,必須有布爾型返回值,用來(lái)標(biāo)識(shí)參數(shù)是否漏傳。
public boolean func(Params params){
if(params==null){
return false;
}
//具體業(yè)務(wù)
return true;
}
三、使用比較
//優(yōu)化前
func("xiaoli","12344455","man","li ming",System.currentTimeMillis(),true,null);
//優(yōu)化后
func(Params.Builder.build().setBody(null).setFlag(true).setTime(System.currentTimeMillis()).setFullname("li ming").setName("xiaoli").setGender("man").setId("12344455").create());