四、建造者模式

  • 目的 :将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
  • 核心 :分离构建步骤(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();						// 调用 开始建造 的方法
	}
}
相关推荐
道尔柯南19 分钟前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
kingx31 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
DevOpenClub3 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
露天赏雪5 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力5 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
天天被压力5 小时前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
captain3765 小时前
▲统一功能——DispatcherServlet源码分析
java·spring·java-ee·log4j·maven
金銀銅鐵5 小时前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程
yeccheng7 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
这个昵称不容易7 小时前
SpringBoot 读书笔记共享平台部署实战:97 个 Java 文件 / 113 个接口 / 10 张表
java·springboot·毕设