GoF23--建造者模式

特性介紹

  • 適合構建複雜對象。
  • 分離了對象子組件的單獨構造和裝配,實現了構建和裝配的解耦。
  • 客戶端不必知道產品內部組成的細節,將產品本身與產品的創建過程解耦,使得相同的創建過程可以創建不同的產品對象。

示例說明

場景描述

以電腦的生產裝配過程爲例,假設一個電腦由顯卡、主板和機箱組成,電腦的組件建造和裝配由不同的接口控制,具體的實現類負責實際操作。

調用關係圖

建造者模式調用關係

示例代碼

1.新建電腦類和電腦的三個組件類

/**
 * 電腦類
 */
public class Computer {

    private GraphicsCrd graphicsCrd;
    private Mainboard mainboard;
    private Crate crate;
    public GraphicsCrd getGraphicsCrd() {
        return graphicsCrd;
    }

    public void setGraphicsCrd(GraphicsCrd graphicsCrd) {
        this.graphicsCrd = graphicsCrd;
    }

    public Mainboard getMainboard() {
        return mainboard;
    }

    public void setMainboard(Mainboard mainboard) {
        this.mainboard = mainboard;
    }

    public Crate getCrate() {
        return crate;
    }

    public void setCrate(Crate crate) {
        this.crate = crate;
    }
}

/**
 * 顯卡類
 */
public class GraphicsCrd{
    private String name;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public GraphicsCrd(String name) {
        this.name = name;
    }
}

/**
 * 主板類
 */
public class Mainboard{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Mainboard(String name) {
        this.name = name;
    }
}

/**
 * 機箱類
 */
public class Crate{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Crate(String name) {
        this.name = name;
    }
}

2.新建電腦組件建造接口及其實現類

/**
 * 電腦組件建造接口
 */
public interface ComputerBuilder {
    //建造顯卡方法
    GraphicsCrd buildGraphicsCrd();
    //建造主板方法
    Mainboard buildMainboard();
    //建造機箱方法
    Crate buildCrate();
}

/**
 * 電腦組件建造實現類
 */
public class FanyiComputerBuilder implements ComputerBuilder {
    @Override
    public GraphicsCrd buildGraphicsCrd() {
        return new GraphicsCrd("泛亦牌顯卡");
    }

    @Override
    public Mainboard buildMainboard() {
        return new Mainboard("泛亦牌主板");
    }

    @Override
    public Crate buildCrate() {
        return new Crate("泛亦牌機箱");
    }
}

3.新建電腦裝配接口及實現類

/**
 * 電腦裝配接口
 */
public interface ComputerDirector {
    //電腦裝配方法
    Computer directorComputer();
}

/**
 * 電腦裝配實現類
 */
public class FanyiComputerDirector implements ComputerDirector{
    private ComputerBuilder builder;

    public FanyiComputerDirector(ComputerBuilder builder) {
        this.builder = builder;
    }

    @Override
    public Computer directorComputer() {
        Computer computer = new Computer();
        computer.setGraphicsCrd(builder.buildGraphicsCrd());
        computer.setMainboard(builder.buildMainboard());
        computer.setCrate(builder.buildCrate());
        return computer;
    }
}

4.新建客戶端/調用者

/**
 * 客戶端/調用者類
 */
public class Client {
    public static void main(String[] args) {
        ComputerDirector fanyiDirector = new FanyiComputerDirector(new FanyiComputerBuilder());
        Computer comp = fanyiDirector.directorComputer();
        System.out.println("顯卡:" + comp.getGraphicsCrd().getName() +
                "  主板:" + comp.getMainboard().getName() +
                "  機箱:" + comp.getCrate().getName());
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章