Appearance
使用多个简单的对象一步一步构建成一个复杂的对象,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;允许用户只通过指定复杂对象的类型和内容就可以构建它们,不需要知道内部的具体构建细节
场景举例
KFC创建套餐:套餐是一个复杂对象,它一般包含主食如汉堡、烤翅等和饮料,如果汁、 可乐等组成部分,不同的套餐有不同的组合,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐
编码实现
创建一个电脑类
java
@Data
public class Computer {
private String cpu;
private String memory;
private String mainboard;
private String disk;
private String power;
}
创建一个抽象建造工厂接口
java
public interface ComputerBuilder {
void buildCpu();
void buildMainboard();
void buildDisk();
void buildPower();
void buildMemory();
Computer createComputer();
}
高配电脑实现
java
public class HighComputerBuilder implements ComputerBuilder{
private Computer computer = new Computer();
@Override
public void buildCpu() {
computer.setCpu("酷睿i9 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("64G内存");
}
@Override
public Computer createComputer() {
return computer;
}
}
低配电脑
java
/**
* 具体的建造者,低配版
* @author cv大魔王
* @version 1.0
* @date 2021/7/10 10:32
*/
public class LowComputerBuilder implements ComputerBuilder{
private Computer computer = new Computer();
@Override
public void buildCpu() {
computer.setCpu("酷睿i3 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("1G内存");
}
@Override
public Computer createComputer() {
return computer;
}
}
“导演类”
java
/**
* 将产品和创建过程进行解耦,使用相同的创建过程创建不同的产品,
* 控制产品生产过程Director是全程指导组装过程,具体的细节还是builder去操作
* @author cv大魔王
*/
public class ComputerDirector {
public Computer create(ComputerBuilder builder){
builder.buildCpu();
builder.buildMemory();
builder.buildMainboard();
builder.buildDisk();
builder.buildPower();
return builder.createComputer();
}
}
使用
java
public class TestMain {
public static void main(String[] args) {
ComputerDirector director = new ComputerDirector();
//构建低配版电脑
Computer computer = director.create(new LowComputerBuilder());
System.out.println(computer);
}
}
优点
- 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦
- 每一个具体建造者都相对独立,而与其他的具体建造者无关,更加精细地控制产品的创建过程
- 增加新的具体建造者无须修改原有类库的代码,符合开闭原则
- 建造者模式结合链式编程来使用,代码上更加美观
缺点:建造者模式所创建的产品一般具有较多的共同点,如果产品差异大则不建议使用
TIP
建造者模式与抽象工厂模式的比较:建造者模式返回一个组装好的完整产品 , 抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族。