定義: 將一個複雜對象的構建和表示分離,使得他的同一個構建可以有不同的表示。(主要是對產品的封裝,強調構建和表示)
適合場景:1. 一個複雜產品,不同方法使用順序不同,表示不同;
2. 一個產品構建是參數較多;
3. 需要對一個比較複雜的對象進行封裝;
接着之前的主題,封裝一個主題。主題中的好多方法使用順序不同,表示不同。
1.構建主題產品;
/**
* 主題 (產品)
*/
public class Theme {
public String aBg;
public String btnBg;
public String textColor;
public String orderColor;
public String getaBg() {
return aBg;
}
public void setaBg(String aBg) {
this.aBg = aBg;
}
public String getBtnBg() {
return btnBg;
}
public void setBtnBg(String btnBg) {
this.btnBg = btnBg;
}
public String getOrderColor() {
return orderColor;
}
public void setOrderColor(String orderColor) {
this.orderColor = orderColor;
}
public String getTextColor() {
return textColor;
}
public void setTextColor(String textColor) {
this.textColor = textColor;
}
@Override
public String toString() {
return "Status{" +
"aBg='" + aBg + '\'' +
", btnBg='" + btnBg + '\'' +
", textColor='" + textColor + '\'' +
", orderColor='" + orderColor + '\'' +
'}';
}
}
2.建造者:(封裝產品的構建)
public abstract class Builder<P> {
public P prodect;
public abstract void setaBg();
public abstract void setBtnbg();
public abstract void setTextColor();
public abstract void setOrderColor();
public abstract P createProduct();
}
3.建造者實現:
public class RedBuilder extends Builder<Theme> {
public RedBuilder() {
this.prodect = new Theme();
}
@Override
public void setaBg() {
this.prodect.setaBg("整體紅色!");
}
@Override
public void setBtnbg() {
this.prodect.setBtnBg("藍色按鈕!");
}
@Override
public void setTextColor() {
this.prodect.setTextColor("文字顏色!");
}
@Override
public void setOrderColor() {
this.prodect.setOrderColor("特定的顏色!");
}
@Override
public Theme createProduct() {
return prodect;
}
}
4.指揮者:
/**
* 指揮者
*/
public class Director {
public Theme create(Builder builder) {
builder.setaBg();
builder.setBtnbg();
builder.setTextColor();
builder.setOrderColor();
return (Theme) builder.createProduct();
}
}
最後使用:
Builder builder = new RedBuilder();
Director director = new Director();
Theme theme = director.create(builder);
System.out.print(theme.toString());
builder和director使得產品的構建和表示分離了,使得一個建造可以有不同的表示。
當然,一般建造者的使用弱化了director,將方法的使用順序交給使用者。但是,已經將產品封裝很好,產品創建完之後,不能再更改,使用者也不會因爲產品方法太多而煩惱。
代碼如下:
public class RedBuilder extends Builder<Theme> {
private String aBg;
private String btnBg;
private String textColor;
private String orderColor;
public RedBuilder() {
}
@Override
public Builder setaBg() {
aBg = "整體紅色!";
return this;
}
@Override
public Builder setBtnbg() {
btnBg = "藍色按鈕!";
return this;
}
@Override
public Builder setTextColor() {
textColor = "文字顏色!";
return this;
}
@Override
public Builder setOrderColor() {
orderColor = "特定的顏色!";
return this;
}
private void config(Theme theme){
theme.setaBg(aBg);
theme.setBtnBg(btnBg);
theme.setTextColor(textColor);
theme.setOrderColor(orderColor);
}
@Override
public Theme createProduct() {
Theme theme=new Theme();
config(theme);
return theme;
}
}
使用的時候
Theme theme = (Theme) new RedBuilder()
.setaBg()
.setBtnbg()
.setOrderColor()
.setOrderColor()
.createProduct();
System.out.print(theme.toString());
當然,以上實現最好用內部類實現,產品的方法私有化。完美!