Java设计模式系列(4):建造者模式

布鸽不鸽 Lv4

前言

构造者模式:使用多个简单的对象,逐渐构建成一个复杂的对象。构造者模式属于创建型模式,它提供了一种创建对象的最佳方式

原文地址:https://xuedongyun.cn/post/24102/

实例

构造者模式包含以下角色:

  • 抽象构造者(Builder)
  • 具体构造者(ConcreteBuilder)
  • 产品类(Product)
  • 指挥者类(Director)

产品类:

1
2
3
4
5
6
7
public class Phone {

private String name;
private String cpu;

// 省略getter和setter
}

抽象构造者:

1
2
3
4
5
6
7
8
9
10
public abstract class Builder {

protected Phone phone = new Phone();

public abstract void buildName();

public abstract void buildCpu();

public abstract Phone createPhone();
}

具体构造者:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ApplePhoneBuilder extends Builder{
@Override
public void buildName() {
phone.setName("iphone");
}

@Override
public void buildCpu() {
phone.setCpu("A14");
}

@Override
public Phone createPhone() {
return phone;
}
}

指挥者:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Director {
private Builder builder;

public Director(Builder builder) {
this.builder = builder;
}

// 核心,使用不同builder来创建对象
public Phone construct() {
builder.buildName();
builder.buildCpu();
return builder.createPhone();
}
}

使用:

1
2
3
4
5
Builder builder = new AppleBuilder();

Director director = new Director(builder);

Phone phone = director.construct();

有时,可以把DirectorBuilder合二为一,简化系统结构。不过如果construct()方法过于复杂,还是建议封装到Director

DirectorBuilder合二为一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public abstruct class Builder {

protected Phone phone = new Phone();

public abstract void buildName();
public abstract void buildCpu();
public abstract Phone createPhone();

public Phone construct() {
this.buildName();
this.buildCpu();
return this.phone;
}
}

模式扩展

建造者模式还有一个用途。如果类构造器需要传入很多参数时,可读性会很差,而且容易出错。此时就可以使用建造者模式重构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Computer {

public Computer(String cpu, String gpu, String motherboard) {
this.cpu = cpu;
this.gpu = gpu;
this.motherboard = motherboard;
}

private String cpu;
private String gpu;
private String motherboard;

public static class Builder {
private String cpu;
private String gpu;
private String motherboard;

public Builder() {}

public Builder cpu(String cpu) {
this.cpu = cpu;
return this;
}

public Builder gpu(String gpu) {
this.gpu = gpu;
return this;
}

public Builder motherBoard(String motherboard) {
this.motherboard = motherboard;
return this;
}

public Computer build() {
return new Computer(cpu, gpu, motherboard);
}
}
}

使用

1
2
3
4
5
Computer computer = new Computer.Builder()
.cpu("i9")
.gpu("3060")
.motherBoard("asus")
.build();

与工厂模式对比

工厂方法模式 VS 建造者模式

  • 工厂方法模式:注重对整体的创建方式
  • 建造者模式:注重的是部件的创建过程

抽象工厂模式 VS 建造者模式

  • 抽象工厂模式:实现对产品家族的创建。不关心构建的过程,只关心什么产品由什么工厂生产

  • 建造者模式:要求按照指定的蓝图建造产品,主要目的是通过组装零配件产生新产品

  • 标题: Java设计模式系列(4):建造者模式
  • 作者: 布鸽不鸽
  • 创建于 : 2023-06-23 15:53:28
  • 更新于 : 2023-06-23 22:01:54
  • 链接: https://xuedongyun.cn//post/24102/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论