建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
模式结构
-Builder:抽象建造者
-ConcreteBuilder:具体建造者
-Director:指挥者
-Product:产品角色
UML
代码分析
/**
* Created by TigerChain
* 替代多参构造方法--建造者模式
*/
public class ComputerB {
private String mainBoard ; // 主板
private String cpu ; // cpu
private String hd ; // 硬盘
private String powerSupplier ; // 电源
private String graphicsCard; // 显卡
// 其它一些可选配置
private String mouse ; // 鼠标
private String computerCase ; //机箱
private String mousePad ; //鼠标垫
private String other ; //其它配件
// ComputerB 自己充当 Director
private ComputerB(ComputerBuilder builder) {
this.mainBoard = builder.mainBoard ;
this.cpu = builder.cpu ;
this.hd = builder.hd ;
this.powerSupplier = builder.powerSupplier ;
this.graphicsCard = builder.graphicsCard ;
this.mouse = builder.mouse ;
this.computerCase = builder.computerCase ;
this.mousePad = builder.mousePad ;
this.other = builder.other ;
}
// 声明一个静态内存类 Builder
public static class ComputerBuilder{
// 一个电脑的必须配置
private String mainBoard ; // 主板
private String cpu ; // cpu
private String hd ; // 硬盘
private String powerSupplier ; // 电源
private String graphicsCard; // 显卡
// 其它一些可选配置
private String mouse ; // 鼠标
private String computerCase ; //机箱
private String mousePad ; //鼠标垫
private String other ; //其它配件
// 这里声明一些必须要传的参数「规定这些参数是必须传的,这里只是举例,再实中可能参数都是可选的」
public ComputerBuilder(String mainBoard,String cpu,String hd,String powerSupplier,String graphicsCard){
this.mainBoard = mainBoard ;
this.cpu = cpu ;
this.hd = hd ;
this.powerSupplier = powerSupplier ;
this.graphicsCard = graphicsCard ;
}
public ComputerBuilder setMainBoard(String mainBoard) {
this.mainBoard = mainBoard;
return this ;
}
public ComputerBuilder setCpu(String cpu) {
this.cpu = cpu;
return this ;
}
// 生成最终的产品
public ComputerB build(){
return new ComputerB(this) ;
}
}
}
优点
1、使创建产品的步骤「把创建产品步骤放在不同的方法中,更加清晰直观」和产品本身分离,即使用相同的创建过程要吧创建出不同的产品
2、每个建造者都是独立的互不影响,这样就达到解耦的目的,所以如果想要替换现有的建造者那非常方便,添加一个实现即可。
缺点
1、如果一个对象有非常复杂的内部结构「这些产品通常有很多属性」,那么使用建造者模式
2、如果想把复杂对象的创建和使用分离开来,那么使用建造者模式「使用相同的创建步骤可以创建不同的产品」
参考博客
https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/builder.html
https://juejin.im/post/5a23bdd36fb9a045272568a6