建造者模式

1.意图

分离复杂对象的构建和表示,同样的构建过程可以创建不同的表示

2.应用场景

  • 一个类有很多属性,但是又不需要类初始化的时候把所有属性初始化
  • 对数据库中某些对象初始化的时候

  • 等等

3.基本的实现思路

  1. 定义Builer接口
    • 接口内定义了建造者应该负责对象建造过程中的哪些事
    • 👉如TerrainBuilder接口
  2. 实现Builder实体类
    • Builder实体类应该去实现对于对象建造过程方法
    • 👉如ComplexTerrainBuilder
  3. 构造某些复杂对象时由Builer代替普通构造方法去负责这个对象的创建过程

4.代码实现

对于一张游戏地图,可能会有很多不同的元素,如墙,堡垒,地雷,等等

我们又不需要在地图这个类初始化的时候将所有地形元素初始化

或者说我们可以根据自己的选择去构造一个地图

a).定义Builder接口

1
2
3
4
5
6
7

public interface {
TerrainBuilder buildWall();
TerrainBuilder buildFort();
TerrainBuilder buildMine();
Terrain build();
}

b).实现Builder实体类

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
//复杂地形构建器
public class ComplexTerrainBuilder implements {
//地形构建器中持有一个地形对象
Terrain terrain = new Terrain();

//将返回值改为TerrainBuilder,可以实现链式编程

public TerrainBuilder buildWall() {
terrain.w = new Wall(10, 10, 50, 50);
return this;
}


public TerrainBuilder buildFort() {
terrain.f = new Fort(10, 10, 50, 50);
return this;
}


public TerrainBuilder buildMine() {
terrain.m = new Mine(10, 10, 50, 50);
return this;
}

//返回持有的地形对象

public Terrain build() {
return terrain;
}
}

c).建造对象过程

1
2
3
4
5
public static void main(String[] args) {
TerrainBuilder builder = new ComplexTerrainBuilder();
//因为builer里return this,所以可以链式编程,记得最后需要.build();
Terrain t = builder.buildFort().buildMine().buildWall().build();
}

补充说明

  • 无需记忆,自然使用
  • 对于构建方法传参非常多的时候,考虑用Builder模式
  • 不使用建造者模式也是可以的,按具体情况决定