【設計模式】(八)--創建型模式--建造者模式

【設計模式】(八)–創建型模式–建造者模式

建造者模式定義

Separate the construction of a complex object from its representation so that the same construction process an create different representations.

意思就是:講一個複雜對象的構建與它的表示分離,使得同樣的構造過程可以創建不同的描述。
建造者一般有以下四個角色:

  • 抽象構造者(Builder) 對於實際類的組成部分進行抽象,定義各種構造邏輯
  • 具體構造者 實現抽象構造者的方法,能夠返回一個構建好的實際類對象
  • 實際類 一般都比較複雜,可能根據不同的構造參數及過程會有不同功能的對象
  • 實際執行者 負責調用具體構造者方法的構造順序,構造出實際需要的類對象

構造者模式的優點

  • 封裝性,構造者模式可以使使用者不必知道類具體實例化的細節
  • 構造者具體事例過程與實際執行者無關,比較容易拓展
  • 因爲封裝性,所以相關類不容易被其他模塊入侵。

構造者模式的使用場景

  • 需要生成的對象具有複雜的內部結構。
  • 需要生成的對象內部屬性本身相互依賴。
  • 需要生成的對象需要創建實際過程要對外隔離。
  • 需要生成的對象方法相同但參數不同,構建方法順序不同,實例化的對象功能不同時。

構造者模式和工廠模式區別

工廠模式 構造者模式
關注點 構造出實際類對象 構造方式類型、構建順序 等不同產生的類的實例對象不同,着重過程

構造者模式簡單實現

類圖
在這裏插入圖片描述

實現

public class Bread {
    private String breadType;

    public String getBreadType() {
        return breadType;
    }

    public void setBreadType(String breadType) {
        this.breadType = breadType;
    }
}

public class Sandwich {
    private String sandwich;

    private int count;

    public String getSandwich() {
        return sandwich;
    }

    public void setSandwich(String sandwich) {
        this.sandwich = sandwich;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

public class Sauce {
    private String sauce;

    public String getSauce() {
        return sauce;
    }

    public void setSauce(String sauce) {
        this.sauce = sauce;
    }
}

public class Hamburger {
    private Bread bread;

    private Sauce sauce;

    private Sandwich sandwich;

    public Bread getBread() {
        return bread;
    }

    public void setBread(Bread bread) {
        this.bread = bread;
    }

    public Sauce getSauce() {
        return sauce;
    }

    public void setSauce(Sauce sauce) {
        this.sauce = sauce;
    }

    public Sandwich getSandwich() {
        return sandwich;
    }

    public void setSandwich(Sandwich sandwich) {
        this.sandwich = sandwich;
    }
}

public interface HamburgerBuilder {

    void buildBread(String bread);

    void buildSandwich(String sandwich, int count);

    void buildSauce(String sauce);

    Hamburger build();
}

public class HamburgerBuilderImpl implements HamburgerBuilder {

    private Hamburger hamburger = new Hamburger();

    @Override
    public void buildBread(String breadType) {
        Bread bread = new Bread();
        bread.setBreadType(breadType);
        hamburger.setBread(bread);
    }

    @Override
    public void buildSandwich(String sandwichName, int count) {
        Sandwich sandwich = new Sandwich();
        sandwich.setSandwich(sandwichName);
        sandwich.setCount(count);
        hamburger.setSandwich(sandwich);
    }

    @Override
    public void buildSauce(String sauceName) {
        Sauce sauce = new Sauce();
        sauce.setSauce(sauceName);
        hamburger.setSauce(sauce);
    }

    @Override
    public Hamburger build() {
        System.out.println("構建了一個:"
                + hamburger.getSandwich().getCount() + "層" + hamburger.getSandwich().getSandwich()
                + hamburger.getSauce().getSauce()
                + hamburger.getBread().getBreadType()
                + "漢堡");
        return hamburger;
    }
}

public class Client {
    public static void main(String[] args) {
        HamburgerBuilder builder = new HamburgerBuilderImpl();
        builder.buildBread("燕麥");
        builder.buildSandwich("豬排", 2);
        builder.buildSauce("芝士");
        //此時就構建了一個雙層豬排芝士漢堡
        Hamburger hamburger = builder.build();
    }
}

執行結果如下,此時一個雙層豬排芝士燕麥漢堡就構建好了,只要出入不同的夾層如雞排那就是雞扒漢堡。
在這裏插入圖片描述

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