- 目的 :将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
- 核心 :分离构建步骤(Builder接口)和指导构建过程(Director),允许通过不同的具体Builder实现来构造不同配置或类型的复杂对象。
- 场景 :1. HTTP 请求构造(如OkHttp、Retrofit)2. 游戏开发(角色/装备构建)3.多步骤的产品订单
首先有个抽象建造者类,声明了若干抽象方法,这些抽象方法就是构建一个复杂对象的各个步骤。
java
package builder;
import model.base.Maze;
public abstract class MazeBuilder {
protected MazeFactory factory;
protected MazeBuilder(MazeFactory factory){
this.factory = factory;}
public abstract void Buildmaze(); // 创建迷宫
public abstract void BuildRoom(int number); //创建房间
public abstract void BuildDoor(int roomFrom, int roomTo); //创建门
}
这里的MazeFactory是一个产品工厂类
java
package builder;
import model.base.Door;
import model.base.Maze;
import model.base.Room;
import model.base.Wall;
public class MazeFactory {
public MazeFactory() {
}
public Maze MakeMaze(){
return new Maze();
}
public Wall MakeWall(){
return new Wall();
}
public Room MakeRoom(final int number){
return new Room(number);
}
public Door MakeDoor(final Room room1, final Room room2){
return new Door(room1, room2);
}
}
然后建造者类继承抽象建造者类,并覆写那些抽象方法。
java
package builder;
public class StandardMazeBuilder extends MazeBuilder {
private Maze currentMaze;
public StandardMazeBuilder(MazeFactory factory) {
super(factory);
}
@Override
public void Buildmaze() {
this.currentMaze = factory.MakeMaze();
}
@Override
public void BuildRoom(int number) {
Room room = factory.MakeRoom(number);
this.currentMaze.AddRoom(room);
}
@Override
public void BuildDoor(int roomFrom, int roomTo) {
Room room1 = this.currentMaze.getRoom(roomFrom);
Room room2 = this.currentMaze.getRoom(roomTo);
Door door = factory.MakeDoor(room1, room2);
}
}
虽然构建一个复杂对象的各个步骤现在已经知道怎么做了,但是各个步骤的执行顺序还没确定,所以还需要一个管理类
java
package builder;
public class Director { // 管理类
private MazeBuilder builder;
public Director(MazeBuilder builder) {
this.builder = builder;
}
public void construct(){ // 固定迷宫的构建步骤
builder.Buildmaze();
builder.BuildRoom(1);
builder.BuildRoom(2);
builder.BuildDoor(1, 2);
}
}
函数入口
java
package builder;
public class MainTest {
public static void main(String[] args) {
MazeFactory factory = new MazeFactory(); // 先实例化迷宫类
MazeBuilder builder = new StandardMazeBuilder(factory); // 再实例化建造者类
Director director = new Director(builder); // 封装构建逻辑:将迷宫的构建步骤(如先建迷宫、再建房间、最后建门)固化在 construct() 方法中。
director.construct(); // 调用 开始建造 的方法
}
}
