建造者模式

建造者模式

一、定义

摘自百度百科:建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式是将一个复杂对象的构建与其分离开,使之可以通过同样构建过程来创建不同的内容。

点击查看源码


二、角色分类

建造者模式共有四种角色,他们分别为:

具体产品

最终被创建的对象

抽象建造者

描述产品对象的各个组成部分的建造方法

具体建造者

根据业务的不同,负责对象各部分的建造过程

使用者

负责创建对象的各个部分,保证对象按顺序或各部分完整创建


三、实现方式

UML图

未命名文件 (3)

比如:如果你想要自己DIY一辆车,这时候车可以按你的需求来组装(抽象建造者),而零件是由你来决定组装什么牌子的(具体建造者),而这辆车由你来组装(使用者),但是无论怎么组装它都是一辆车(具体产品)

具体产品

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Data
@ToString
public class Car {

/**
* 发动机
*/
private String engine;

/**
* 轮子
*/
private String wheel;

/**
* 气缸
*/
private String cylinder;

/**
* 车的颜色
*/
private String color;
}

抽象建造者

1
2
3
public interface Builder {
Object build();
}

具体建造者

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
public class CarBuilder implements Builder {

private Car car = new Car();

public CarBuilder engine(String engine){
car.setEngine(engine);
return this;
}

public CarBuilder wheel(String wheel){
car.setWheel(wheel);
return this;
}

public CarBuilder cylinder(String cylinder){
car.setCylinder(cylinder);
return this;
}

pulic CarBuilder color(String color){
car.setColor(color);
return this;
}

@Override
public Car build(){
return this.car;
}
}

使用者

1
2
3
4
5
6
7
8
9
10
11
public class Test {

public static void main(String[] args) {
Car car = new CarBuilder().engine("发动机1")
.wheel("轮子1")
.cylinder("气缸1")
.color("黑色")
.build();
System.out.println(car);
}
}

0098d1a1d9804882ba965bd74cbbdb05.png


四、优缺点

优点:

  • 创建与使用分离,建造类之间互相独立,实现了解耦

缺点:

  • 当类比较多的时候,需要创建很多建造类,在一定程度上增加了系统理解难度
  • 当产品内部进行了修改的话,建造类也要修改,当建造类多的时候会增加维护难度

五、应用场景

以下部分内容摘自菜鸟教程

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

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

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

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

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

应用实例:

  1. 去肯德基,汉堡、可乐、薯条、炸鸡是不变的,而其组合是经常变化的,生成出所谓的“套餐”
  2. Java中的StringBuilder

优点:

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

缺点:

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

使用场景:

  1. 需要生成的对象具有复杂的内部结构。
  2. 需要生成的对象内部属性本身相互依赖。

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

建造者模式适用于复杂产品的创建过程,比如一个产品会因为业务需求经常变化组成这个产品的各个零件,但是整体组合方式较为稳定的场景下

  • 适用于更注重同一个方法执行顺序不同产生不同结果的场景下
  • 适用于不同零件装配到一个对象产生不同对象的场景下
  • 适用于初始化对象参数多且很多参数有默认值的场景下

六、小结

建造者模式适合于复杂对象的创建,且更注重执行顺序的情况,遇到这种情况我们可以选择建造者模式来将共同的创建过程提取出来,进行自定义的建造,这样的写法更为灵活。