1. 程式人生 > 程式設計 >詳解設計模式 建造者模式

詳解設計模式 建造者模式

建造者模式

建造者模式屬於建立型設計模式,用來組裝複雜的例項

定義: 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示

建造者模式是一步一步建立一個複雜的物件,它允許使用者只通過指定複雜物件的型別和內容就可以構建它們,使用者不需要知道內部的具體構建細節。

模式類圖

角色

  1. 抽象建造者:Builder,目的是為了將建造的具體過程交給它的子類來實現。這樣更容易擴充套件。一般至少會有兩個抽象方法,一個用來建造產品,一個是用來返回產品
  2. 具體的建造者: ConcreteBuilder,實現抽象建造者的所有未實現的方法,具體來說一般是兩項任務:組建產品;返回組建好的產品
  3. 產品類:Product,一般是一個較為複雜的物件
  4. 管理類:Director,負責呼叫適當的建造者來組建產品,被用來封裝程式中易變的部分

優點

  1. 客戶端不必知道產品內部組成的細節,封裝性好
  2. 建造者獨立,容易擴充套件

實現

原始碼地址:github.com/mingyuHub/d…

以電腦為例,電腦擁有cpu,記憶體,硬碟,涉及的類:Builder(抽象建造者)ConcreteBuilder(具體的建造者)Computer(產品類)Director(管理類)

抽象建造者
/**
 * @author: chenmingyu
 * @date: 2019/3/4 17:05
 * @description: 抽象建造者
 */
public abstract
class Builder { /** * 組裝cpu */ public abstract void builderCpu(String cpu); /** * 組裝記憶體 */ public abstract void builderMemory(String memory); /** * 組裝硬碟 */ public abstract void builderDisk(String disk); /** * 獲取電腦 * @return */ public
abstract Computer getComputer()
; } 複製程式碼
具體的建造者
/**
 * @author: chenmingyu
 * @date: 2019/3/4 17:14
 * @description: 具體的建造者
 */
public class ConcreteBuilder extends Builder {

    private Computer computer = new Computer();

    @Override
    public void builderCpu(String cpu) {
        computer.setCpu(cpu);
    }

    @Override
    public void builderMemory(String memory) {
        computer.setMemory(memory);
    }

    @Override
    public void builderDisk(String disk) {
        computer.setDisk(disk);
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}
複製程式碼
產品類
/**
 * @author: chenmingyu
 * @date: 2019/3/4 16:57
 * @description: 電腦產品
 */
@Data
public class Computer {

    private String cpu;

    private String memory;

    private String disk;

}
複製程式碼
主管類
/**
 * @author: chenmingyu
 * @date: 2019/3/4 17:10
 * @description: 主管類
 */
public class Director {

    private Builder builder = new ConcreteBuilder();

    /**
     * 組裝電腦
     */
    public Computer builderComputer(String cpu,String memory,String disk){
        builder.builderCpu(cpu);
        builder.builderMemory(memory);
        builder.builderDisk(disk);
        return builder.getComputer();
    }
}
複製程式碼
測試
public static void main(String[] args) {
    Director director = new Director();
    Computer computer = director.builderComputer("Intel cpu","記憶體","硬碟");
    System.out.println(computer);
}
複製程式碼
輸出
Computer(cpu=Intel cpu,memory=記憶體,disk=硬碟)
複製程式碼

建造者模式與工程方法模式的不同在於建造者模式關注的是零件型別和裝配工藝(順序)

更常見的使用方式

使用靜態內部類

public class Cache {

    private final String name;

    private final String condition;

    protected Cache(Builder b) {
        this.name = b.name;
        this.condition = b.condition;
    }

    public String getName() {
        return name;
    }

    public String getCondition() {
        return condition;
    }

    public static class Builder {

        private String name = "";
        private String condition = "";

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

        public Builder setCondition(String condition) {
            this.condition = condition;
            return this;
        }

        public Cache build(){
            return new Cache(this);
        };
    }
}
複製程式碼

使用時:

new Cache.Builder().setName("cmy").setCondition("condition").build();
複製程式碼

相關閱讀

詳解設計模式 單例模式

詳解設計模式 工廠方法

詳解設計模式 抽象工廠