设计模式-建造者模式

时间:2022年9月21日

本文档摘抄自:菜鸟教程 ,修改部分

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

一、介绍

意图: 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决: 主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用: 一些基本部件不会变,而其组合经常变化的时候。

如何解决: 将变与不变分离开。

关键代码: 建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的”套餐”。 2、JAVA 中的 StringBuilder。

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

注意事项: 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

二、示例

依然选择机器人做为一个例子,这次机器人的组件是头和身体和颜色。

使用建造者模式代码如下:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
@Data  
public class RobotBody {

/** 型号 */
private String type;

/** 可以干嘛 */
private String canDo;


}

@Data
public class RobotHead {

private String type;

private String canDo;


}

public class Robot {

/** 名 */
private final String name;

private final RobotBody body;

private final RobotHead head;

private final String color;

private Robot(final String name, final RobotBody body, final RobotHead head, final String color) {
this.name = name;
this.body = body;
this.head = head;
this.color = color;
}

public void show(){
System.out.println("我的名称是" + name + ",颜色是" + color);
System.out.println("我的头可以:" + head.getCanDo());
System.out.println("我的身体可以:" + body.getCanDo());
}

public static class RobotBuilder {
private String name;
private RobotBody body;
private RobotHead head;
private String color;

RobotBuilder() {
}

public RobotBuilder name(final String name) {
this.name = name;
return this; }

public RobotBuilder body(final RobotBody body) {
this.body = body;
return this; }

public RobotBuilder head(final RobotHead head) {
this.head = head;
return this; }

public RobotBuilder color(final String color) {
this.color = color;
return this; }

public Robot build() {
return new Robot(this.name, this.body, this.head, this.color);
}

public String toString() {
return "Robot.RobotBuilder(name=" + this.name + ", body=" + this.body + ", head=" + this.head + ", color=" + this.color + ")";
}
}

}

三、工厂模式Vs建造者模式

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

工厂方法模式注重的是整体对象的创建方式;而建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造创建出一个复杂的对象。

我们举个简单例子来说明两者的差异,如要制造一个超人,如果使用工厂方法模式,直接产生出来的就是一个力大无穷、能够飞翔、内裤外穿的超人;而如果使用建造者模式,则需要组装手、头、脚、躯干等部分,然后再把内裤外穿,于是一个超人就诞生了。

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

抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。

建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。

如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车。