android設計模式:Builder模式
阿新 • • 發佈:2019-02-20
Builder模式(建造者模式):將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
我們看看一種物件生成的方式,以寵物醫院記錄寵物狗資訊為例:
//汪汪資訊類
public class Dog{
private int identifier;//編號
private String name;//名字
private int age;//年齡
private int weight;//體重
private String breed;//品種
private boolean gender;//性別,true:公狗;false:母狗
private String sickness;//疾病
public void setIdentifier(int identifier){
this.identifier=identifier;
}
public void setName(String name){
this.name=name;
}
public void setAge(int age){
this.age=age;
}
public void setWeight(int weight){
this .weight=weight;
}
public void setBreed(int breed){
this.breed=breed;
}
public void setGender(boolean gender){
this.gender=gender;
}
public void setSickness(String sickness){
this.sickness=sickness;
}
}
//一隻新的汪進來了
Dog dog=new Dog;
dog.setIdentifier(2222 );//因為是一隻二哈,2炸了
dog.setName("sijia");//撕家小能手呀
dog.setAge(3);
dog.setWeight(20);
dog.setBreed("Husky");
dog.setGender(true);
dog.setSickness("doubi");//這隻哈士奇太逗逼了,還能治嗎?
終於把它的資訊記錄完了,有沒發現類名dog都重複了好多遍,那有沒有簡潔點的方式,有的。在Dog類中增加新的方法:
public void setDogInfo(int identifier,int String name,int age,int weight,String breed,boolean gender,String sickness){
this.identifier=identifier;
this.name=name;
this.age=age;
this.weight=weight;
this.breed=breed;
this.gender=gender;
this.sickness=sickness;
}
//感覺完美呀,呼叫看看
Dog dog=new Dog();
dog.setDogInfo(2222,"sijia",3,20,"Husky",true,"doubi");
一行搞定,不過數字和字串的含義不是一目瞭然,還是得檢視定義。新增引數就得修改定義,呼叫的地方也得修改
而且如果引數更多的話,看起來會更亂
建造者模式就為提供了另外一種解決方式,引入構造器Builder,讓它實現構造的任務。
//汪汪資訊類
public class Dog{
private int identifier;//編號
private String name;//名字
private int age;//年齡
private int weight;//體重
private String breed;//品種
private boolean gender;//性別,true:公狗;false:母狗
private String sickness;//疾病
static class Builder{
private Dog dog;
public Builder(){
dog=new Dog();
}
public Builder setIdentifier(int identifier){
dog.identifier=identifier;
return this;
}
public Builder setName(String name){
dog.name=name;
return this;
}
public Builder setAge(int age){
dog.age=age;
return this;
}
public Builder setWeight(int weight){
dog.weight=weight;
return this;
}
public Builder setBreed(int breed){
dog.breed=breed;
return this;
}
public Builder setGender(boolean gender){
dog.gender=gender;
return this;
}
public Builder setSickness(String sickness){
dog.sickness=sickness;
return this;
}
public Dog create(){
return dog;
}
}
}
在物件內部增加了Builder,Buidler設定引數的方法返回都是Builder這個物件
現在呼叫一下:
Dog dog=new Dog.Builder().setIdentifier(2222).setName("sijia").setAge(3)
.setWeight(20).setBreed("Husky").setGender(true).setSickness("doubi")
.create();
這樣,每項引數定義清晰,而且直接頭尾相連定義,省去重複的程式碼。
感覺上是我們先獲取Builder,然後構建所有引數,最後再將構建出的物件顯露出來。
契合了模式定義:將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。