使用场景
- 需要生成的对象具有复杂的内部结构。
- 计算机是由CPU、主板、内存、硬盘、显卡、机箱、显示器、键盘、鼠标等部件组装而成的,采购员不可能自己去组装计算机
- 且某些不是必需品,比如鼠标键盘
- 需要生成的对象内部属性间有依赖关系。
- 比如没有主板才能有内存。
或者功能间有顺序要求。
当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式
建造者模式创建更为复杂的对象,大到组装都可以抽象为独立的逻辑。
-
类图
角色
抽象建造者(Builder):主要用于规范产品类的各个组成部分,并提供一个返回完整产品的接口。系统中的产品可能有多种类型,对某些产品族来说,它们具备相同的行为,因此对这些共性行为进行抽象,抽离出 抽象建造者(Builder);
- 具体建造者(Concrete Builder):实现 抽象建造者 规定的各个方法,返回一个组件好的具体产品。
- 产品(Product):构建相当复杂的类型,建造者最终创建的产品类型。
导演者(Director):指导 建造者(Builder) 以特定行为构建出产品。
实现方式
结合链式调用
Computer computer=new Computer.Builder("因特尔","三星").setDisplay("三星24寸").setKeyboard("罗技").setUsbCount(2).build();// 此处通过链式调整替代了导演者的职责public class Computer {private final String cpu;//必须private final String ram;//必须private final int usbCount;//可选private final String keyboard;//可选private final String display;//可选private Computer(Builder builder){this.cpu=builder.cpu;this.ram=builder.ram;this.usbCount=builder.usbCount;this.keyboard=builder.keyboard;this.display=builder.display;}public static class Builder{private String cpu;//必须private String ram;//必须private int usbCount;//可选private String keyboard;//可选private String display;//可选public Builder(String cup,String ram){this.cpu=cup;this.ram=ram;}public Builder setUsbCount(int usbCount) {this.usbCount = usbCount;return this;}public Builder setKeyboard(String keyboard) {this.keyboard = keyboard;return this;}public Builder setDisplay(String display) {this.display = display;return this;}public Computer build(){return new Computer(this);}}}
传统模式
```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
