設計模式__建造者模式

定義: 將一個複雜對象的構建和表示分離,使得他的同一個構建可以有不同的表示。(主要是對產品的封裝,強調構建和表示)

適合場景: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());

當然,以上實現最好用內部類實現,產品的方法私有化。完美!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章