使用场景

  • 需要生成的对象具有复杂的内部结构。
    • 计算机是由CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机
    • 且某些不是必需品,比如鼠标键盘
  • 需要生成的对象内部属性间有依赖关系。
    • 比如没有主板才能有内存。
  • 或者功能间有顺序要求。

    • 比如先要插上电源才能开机。

      个人理解

  • 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式

    • 虽然可以通过折叠构造函数模式实现,但弊端很明显,使用及阅读很不方便。

      优缺点

      优点:
      1、建造者独立,易扩展。
      2、便于控制细节风险。
      缺点:
      1、产品必须有共同点,范围有限制。
      2、如内部变化复杂,会有很多的建造类。

      设计原理

      核心思想

      生产与组建分离,是生产专注于生产,组装专注于组装。从而使逻辑清晰(性能提升)
      [建造者模式](https://baike.baidu.com/item/%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F) 最终返回一个具体的构建复杂的产品;

      实现步骤

      个人理解

  • 建造者模式创建更为复杂的对象,大到组装都可以抽象为独立的逻辑。

  • 产品由建造者返回,过程由导演者控制

    类图

    clipboard.png

    角色

  • 抽象建造者(Builder):主要用于规范产品类的各个组成部分,并提供一个返回完整产品的接口。系统中的产品可能有多种类型,对某些产品族来说,它们具备相同的行为,因此对这些共性行为进行抽象,抽离出 抽象建造者(Builder)

  • 具体建造者(Concrete Builder):实现 抽象建造者 规定的各个方法,返回一个组件好的具体产品。
  • 产品(Product):构建相当复杂的类型,建造者最终创建的产品类型。
  • 导演者(Director):指导 建造者(Builder) 以特定行为构建出产品。

    实现方式

    结合链式调用

    1. Computer computer=new Computer.Builder("因特尔","三星")
    2. .setDisplay("三星24寸")
    3. .setKeyboard("罗技")
    4. .setUsbCount(2)
    5. .build();
    6. // 此处通过链式调整替代了导演者的职责
    7. public class Computer {
    8. private final String cpu;//必须
    9. private final String ram;//必须
    10. private final int usbCount;//可选
    11. private final String keyboard;//可选
    12. private final String display;//可选
    13. private Computer(Builder builder){
    14. this.cpu=builder.cpu;
    15. this.ram=builder.ram;
    16. this.usbCount=builder.usbCount;
    17. this.keyboard=builder.keyboard;
    18. this.display=builder.display;
    19. }
    20. public static class Builder{
    21. private String cpu;//必须
    22. private String ram;//必须
    23. private int usbCount;//可选
    24. private String keyboard;//可选
    25. private String display;//可选
    26. public Builder(String cup,String ram){
    27. this.cpu=cup;
    28. this.ram=ram;
    29. }
    30. public Builder setUsbCount(int usbCount) {
    31. this.usbCount = usbCount;
    32. return this;
    33. }
    34. public Builder setKeyboard(String keyboard) {
    35. this.keyboard = keyboard;
    36. return this;
    37. }
    38. public Builder setDisplay(String display) {
    39. this.display = display;
    40. return this;
    41. }
    42. public Computer build(){
    43. return new Computer(this);
    44. }
    45. }
    46. }

    传统模式

    ```c public abstract class ComputerBuilder { public abstract void setUsbCount(); public abstract void setKeyboard(); public abstract void setDisplay();

    public abstract Computer getComputer(); }

public class ComputerDirector { public void makeComputer(ComputerBuilder builder){ builder.setUsbCount(); builder.setDisplay(); builder.setKeyboard(); } } ```

参考文档

https://www.jianshu.com/p/9a90ca0fc24f
https://www.jianshu.com/p/3d1c9ffb0a28
https://zhuanlan.zhihu.com/p/58093669