1. 程式人生 > 其它 >04.(建立型模式)java設計模式之建造者模式

04.(建立型模式)java設計模式之建造者模式

一、什麼是建造者模式

  • 使⽤多個簡單的物件⼀步⼀步構建成⼀個複雜的物件,將⼀個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。
  • 允許⽤戶只通過指定複雜物件的型別和內容就可以構建它們,不需要知道內部的具體構建細節。

二、建造者的實現方式

模式結構分析:

Product(具體產品類):產品⻆⾊。

Builder(抽象建造類):抽象建造者,定義多個通⽤⽅法和構建⽅法。

ConcreteBuilder(具體建造類):具體建造者,可以有多個。

Director(指揮者類):指揮者,控制整個組合過程,將需求交給建造者,由建造者去建立物件。

類關係圖:

統一模型:

程式碼實現:

檢視程式碼
/*
* 建造者中具體的產品資訊
* */
@Data
public class Computer {
    private String memory;
    private String cpu;
    private String mainboard;
    private String disk;
    private String power;
}
/*
* 抽象建造者
* */
public interface IComputerBuilder {
    void buildCpu();
    void buildMainboard();
    void buildDisk();
    void buildPower();
    void buildMemory();
    Computer createComputer();
}
/*
* 具體建造者
* */
public class HighComputerBuilder implements IComputerBuilder{
    Computer computer;
    public  HighComputerBuilder(){
        computer=new Computer();
    }
    @Override
    public void buildCpu() {
     computer.setCpu("這個是高配的CPU……");
    }

    @Override
    public void buildMainboard() {
        computer.setMainboard("這個是高配的主機板……");
    }

    @Override
    public void buildDisk() {
        computer.setDisk("這個是高配的硬碟……");
    }

    @Override
    public void buildPower() {
        computer.setPower("這個是高配的電源……");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("這個是高配的記憶體……");
    }

    @Override
    public Computer createComputer() {
        return computer;
    }
}
/*
 * 具體建造者
 * */
public class LowerComputerBuilder implements IComputerBuilder{
    Computer computer;
    public  LowerComputerBuilder(){
        computer=new Computer();
    }
    @Override
    public void buildCpu() {
        computer.setCpu("這個是低配的CPU……");
    }

    @Override
    public void buildMainboard() {
        computer.setMainboard("這個是低配的主機板……");
    }

    @Override
    public void buildDisk() {
        computer.setDisk("這個是低配的硬碟……");
    }

    @Override
    public void buildPower() {
        computer.setPower("這個是低配的電源……");
    }

    @Override
    public void buildMemory() {
        computer.setMemory("這個是低配的記憶體……");
    }

    @Override
    public Computer createComputer() {
        return computer;
    }
}
/*
* 指揮者,控制整個組合過程,將需求交給建
造者,由建造者去建立物件
* */
public class ComputerDirector {
    public Computer createCompany(IComputerBuilder builder){
        builder.buildMemory();
        builder.buildCpu();
        builder.buildMainboard();
        builder.buildDisk();
        builder.buildPower();
        return builder.createComputer();
    }
}

測試用例:

/*
* 建造者模式的使用場景中的案例
* */
@Test
public void Builder(){
    IComputerBuilder builder=new HighComputerBuilder();
    ComputerDirector director=new ComputerDirector();
    Computer computer=director.createCompany(builder);
    System.out.println(computer.toString());
}

測試結果:

Computer(memory=這個是高配的記憶體……, cpu=這個是高配的CPU……, mainboard=這個是高配的主機板……, disk=這個是高配的硬碟……, power=這個是高配的電源……)

方法評估:

優點:

    • 客戶端不必知道產品內部組成的細節,將產品本身與產品的建立過程解耦。
    • 每⼀個具體建造者都相對獨⽴,⽽與其他的具體建造者⽆關,更加精細地控制產品的建立過程。
    • 增加新的具體建造者⽆須修改原有類庫的程式碼,符合開閉原則。
    • 建造者模式結合鏈式程式設計來使⽤,程式碼上更加美觀。

缺點:

    • 建造者模式所建立的產品⼀般具有較多的共同點,如果產品差異⼤則不建議使⽤。

三、彙總

建造者模式與抽象⼯⼚模式的⽐較:

建造者模式返回⼀個組裝好的完整產品 , 抽象⼯⼚模式返回⼀系列相關的產品,這些產品位於不同的產品等級結構,構成了⼀個產品族。