將一個複雜對象的 構建和表示 分離的模型
什麼意思呢,就是比如我要創建一個對象,我只需要把最重要的一些信息告訴他,他就可以幫我完成所有的事情,不需要了解具體的構建過程
接下來,我們直接實現一個建造者模式示例代碼
比如,我要製造一個手機,建造者模式可以讓我不用瞭解到具體手機怎麼生產的,只需要提供手機的一些參數,比如顏色,系統等,就可以製造出一個完整的手機了。
/**
* 手機產品實體類,定義手機的一些屬性(顏色,系統)
*/
public class Phone {
private String color;
private String os;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getOs() {
return os;
}
public void setOs(String os) {
this.os = os;
}
}
/**
* 抽象的構建類
*/
public abstract class Builder {
public abstract void buildColor(String color);
public abstract void buildOs(String os);
}
/**
* 具體的構建類
*/
public class HuaweiBuilder extends Builder {
private Phone huaweiPhone = new Phone();
@Override
public void buildColor(String color) {
huaweiPhone.setColor(color);
}
@Override
public void buildOs(String os) {
huaweiPhone.setOs(os);
}
public Phone getHuaweiPhone() {
return huaweiPhone;
}
}
/**
* 導演類,導演所有的一切,構建對象的各個部分
* 其實這就有點像什麼,像做了一些簡單的封裝,
* 讓外面的人可以輕易的創建具體需要的對象,
* 而不用知道里面做了啥
*/
public class Director {
Builder mBuilder;
public Director(Builder builder) {
this.mBuilder = builder;
}
public void constract(String color, String os) {
mBuilder.buildColor(color);
mBuilder.buildOs(os);
}
}
以上就是建造者模式完整一條鏈的代碼了。
現在我要製造一個手機就很簡單了,如下
public void main() {
Builder builder = new HuaweiBuilder();
Director director = new Director(builder);
director.constract("黃色", "Android");
}
通過簡單的傳參,創建生產對象。
但是其實一般不這麼做,而是通過內部類方法通過builder的一種***鏈式表達構建對象***,比如dialog構建等,這裏也舉例說明:
public static class XiaomiPhone {
private String color;
private String os;
private XiaomiPhone(Builder builder) {
this.color = builder.color;
this.os = builder.os;
}
public String getColor() {
return color;
}
public String getOs() {
return os;
}
static class Builder {
private String color;
private String os;
public Builder setColor(String color) {
this.color = color;
return this;
}
public Builder setOs(String os) {
this.os = os;
return this;
}
public XiaomiPhone builder() {
return new XiaomiPhone(this);
}
}
}
然後我們實現起來就比較簡單了
public void main() {
XiaomiPhone xiaomiPhone = new XiaomiPhone.Builder()
.setColor("")
.setOs("")
.builder();
}
在Android中的應用
哇,簡直不要太常見,dialog構建怎麼寫的?
AlertDialog.Builder builder = new AlertDialog.Builder(this).setIcon(R.mipmap.ic_launcher).setTitle("")
.setMessage("").setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder.create().show();
爲什麼用建造者模式呢?其實就是方便用戶使用的時候,知道要傳哪些參數,方便且正確。