Java 設計模式--建造者(Builder)模式

建造者模式是日常開發中比較常見的設計模式,它的主要作用就是講複雜事務創建的過程抽象出來,該抽象的不同實現方式,創建出的對象也不同。
通俗地講,創建一個對象一般都會有一個固定的步驟,這個固定的步驟我們把它抽象出來。

建造者模式分爲兩種:

  • 經典建造者模式
  • 變種建造者模式

經典建造者模式

UML類圖
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pIuNyKwS-1591857099537)(file:///Users/yangmingyue/Documents/Gridea/post-images/1590993459408.jpg)]
四個角色:

  • Product – 產品
  • Builder – 抽象的步驟
  • ConcreteBuilder – Builder具體的實現
  • Director – 使用者

代碼:

 public class Computer {
    /*CPU*/
    private String CPU;
    /*內存*/
    private String memory;
    /*硬盤*/
    private String hardDisk;
    /*鍵盤*/
    private String keyboard;
    /*鼠標*/
    private String mouse;

    public String getCPU() {
        return CPU;
    }

    public void setCPU(String CPU) {
        this.CPU = CPU;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getHardDisk() {
        return hardDisk;
    }

    public void setHardDisk(String hardDisk) {
        this.hardDisk = hardDisk;
    }

    public String getKeyboard() {
        return keyboard;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }

    public String getMouse() {
        return mouse;
    }

    public void setMouse(String mouse) {
        this.mouse = mouse;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "CPU='" + CPU + '\'' +
                ", memory='" + memory + '\'' +
                ", hardDisk='" + hardDisk + '\'' +
                ", keyboard='" + keyboard + '\'' +
                ", mouse='" + mouse + '\'' +
                '}';
    }
}

Builder 類:

public interface ComputerConfigBuilder {
    void setCPU();
    void setMemery();
    void setHardDisk();
    void setKeyboard();
    void setMouse();
    Computer getComputer();
}

具體實現:

public class LowConfigBuilder implements ComputerConfigBuilder {

    private Computer mComputer;

    public LowConfigBuilder(){
        this.mComputer = new Computer();
    }

    @Override
    public void setCPU() {
        mComputer.setCPU("i5");
    }

    @Override
    public void setMemery() {
        mComputer.setMemory("8G");
    }

    @Override
    public void setHardDisk() {
        mComputer.setHardDisk("500G");
    }

    @Override
    public void setKeyboard() {
        mComputer.setKeyboard("薄膜鍵盤");
    }

    @Override
    public void setMouse() {
        mComputer.setMouse("有線鼠標");
    }

    @Override
    public Computer getComputer() {
        return mComputer;
    }
}

Director:

public class Director {
    private ComputerConfigBuilder mBuilder;
    public void setBuilder(ComputerConfigBuilder builder){
        this.mBuilder = builder;
    }
    public void createComputer(){
        mBuilder.setCPU();
        mBuilder.setMemery();
        mBuilder.setHardDisk();
        mBuilder.setKeyboard();
        mBuilder.setMouse();
    }
    public Computer getComputer(){
        return mBuilder.getComputer();
    }
}

Test:

Director director = new Director();//創建裝機人員
director.setBuilder(new LowConfigBuilder()); //告訴裝機人員電腦配置,這裏爲低配版
director.createComputer(); //裝機人員開始組裝
Computer computer = director.getComputer(); //從裝機人員獲取組裝好的電腦
System.out.print("電腦配置:" + computer.toString());  //查看電腦配置

director.setBuilder(new HighConfigBuider());
director.createComputer();
Computer computer = director.getComputer();
System.out.print("電腦配置:" + computer.toString());

變種Builder模式

代碼:

public class Person {
    /*名字(必須)*/
    private final String name;
    /*性別(必須)*/
    private final String gender;
    /*年齡(非必須)*/
    private final String age;
    /*鞋子(非必須)*/
    private final String shoes;
    /*衣服(非必須)*/
    private final String clothes;
    /*錢(非必須)*/
    private final String money;
    /*房子(非必須)*/
    private final String house;
    /*汽車(非必須)*/
    private final String car;
    /*職業(非必須)*/
    private final String career;


    private Person(Builder builder) {
        this.name = builder.name;
        this.gender = builder.gender;
        this.age = builder.age;
        this.shoes = builder.shoes;
        this.clothes = builder.clothes;
        this.money = builder.money;
        this.house = builder.house;
        this.car = builder.car;
        this.career = builder.career;
    }

    public static class Builder {
        private final String name;
        private final String gender;
        private String age;
        private String shoes;
        private String clothes;
        private String money;
        private String house;
        private String car;
        private String career;

        public Builder(String name,String gender) {
            this.name = name;
            this.gender = gender;
        }

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

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

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

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

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

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

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

        public Person build(){
            return new Person(this);
        }
    }

Test:

        Person person = new Person.Builder("張三","男")
                .age("12")
                .money("1000000")
                .car("寶馬")
                .build();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章