——以构建复杂游戏角色为核心案例,结合Unity/C#实现
核心目标:
✅ 分步骤创建复杂对象,允许灵活配置各部件
✅ 隔离构建过程与对象表示,相同构建过程可创建不同表现
✅ 支持可选部件和构建顺序控制
关键术语:
数学表达:
设建造者为B,产品为P,存在映射关系:
B.BuildPart1() × B.BuildPart2() × … × B.BuildPartN() → P
public class GameCharacter {
public string Head { get; set; }
public string Body { get; set; }
public string Weapon { get; set; }
public List<string> Accessories { get; } = new();
public void DisplayInfo() {
Debug.Log($"角色配置:" +
$"\n头部:{Head}" +
$"\n身体:{Body}" +
$"\n武器:{Weapon}" +
$"\n装饰品:{string.Join(", ", Accessories)}");
}
}
public interface ICharacterBuilder {
void BuildHead();
void BuildBody();
void BuildWeapon();
void AddAccessory(string item);
GameCharacter GetResult();
}
public class WarriorBuilder : ICharacterBuilder {
private GameCharacter _character = new();
public void BuildHead() => _character.Head = "钢制头盔";
public void BuildBody() => _character.Body = "板甲";
public void BuildWeapon() => _character.Weapon = "双手巨剑";
public void AddAccessory(string item) {
if(new[]{"披风", "肩甲"}.Contains(item))
_character.Accessories.Add(item);
}
public GameCharacter GetResult() => _character;
}
public class ArcherBuilder : ICharacterBuilder {
private GameCharacter _character = new();
public void BuildHead() => _character.Head = "皮帽";
public void BuildBody() => _character.Body = "皮甲";
public void BuildWeapon() => _character.Weapon = "复合长弓";
public void AddAccessory(string item) {
if(new[]{"箭袋", "护腕"}.Contains(item))
_character.Accessories.Add(item);
}
public GameCharacter GetResult() => _character;
}
public class CharacterDirector {
private ICharacterBuilder _builder;
public CharacterDirector(ICharacterBuilder builder) {
_builder = builder;
}
public GameCharacter ConstructBasic() {
_builder.BuildHead();
_builder.BuildBody();
_builder.BuildWeapon();
return _builder.GetResult();
}
public GameCharacter ConstructDeluxe() {
_builder.BuildHead();
_builder.BuildBody();
_builder.BuildWeapon();
_builder.AddAccessory("披风");
_builder.AddAccessory("特殊徽章");
return _builder.GetResult();
}
}
public class CharacterCreationSystem : MonoBehaviour {
void Start() {
// 创建战士
var warriorBuilder = new WarriorBuilder();
var director = new CharacterDirector(warriorBuilder);
GameCharacter basicWarrior = director.ConstructBasic();
basicWarrior.DisplayInfo();
GameCharacter deluxeWarrior = director.ConstructDeluxe();
deluxeWarrior.DisplayInfo();
// 自定义构建
var customBuilder = new WarriorBuilder();
customBuilder.BuildHead();
customBuilder.BuildBody();
customBuilder.AddAccessory("传奇披风");
GameCharacter customWarrior = customBuilder.GetResult();
}
}
public interface IFluentBuilder {
IFluentBuilder BuildHead();
IFluentBuilder BuildBody();
IFluentBuilder AddAccessory(string item);
GameCharacter Build();
}
public class FluentWarriorBuilder : IFluentBuilder {
private GameCharacter _character = new();
public IFluentBuilder BuildHead() {
_character.Head = "角斗士头盔";
return this;
}
public IFluentBuilder BuildBody() {
_character.Body = "锁子甲";
return this;
}
public IFluentBuilder AddAccessory(string item) {
_character.Accessories.Add(item);
return this;
}
public GameCharacter Build() => _character;
}
// 使用示例
var hero = new FluentWarriorBuilder()
.BuildHead()
.BuildBody()
.AddAccessory("王者之证")
.Build();
public class PrefabBuilder : MonoBehaviour {
[SerializeField] private Transform root;
[SerializeField] private GameObject headPrefab;
[SerializeField] private GameObject bodyPrefab;
public PrefabBuilder BuildHead() {
Instantiate(headPrefab, root);
return this;
}
public PrefabBuilder BuildBody() {
Instantiate(bodyPrefab, root);
return this;
}
}
// 在场景中使用
StartCoroutine(BuildCharacterRoutine());
IEnumerator BuildCharacterRoutine() {
var builder = GetComponent<PrefabBuilder>();
yield return new WaitForSeconds(1);
builder.BuildHead();
yield return new WaitForSeconds(1);
builder.BuildBody();
}
public class ConfigDrivenBuilder : ICharacterBuilder {
private CharacterConfig _config;
private GameCharacter _character = new();
public ConfigDrivenBuilder(CharacterConfig config) {
_config = config;
}
public void BuildHead() => _character.Head = _config.headOptions[_config.selectedHead];
public void BuildBody() => _character.Body = _config.bodyOptions[_config.selectedBody];
// ...其他方法
}
角色创建系统
关卡编辑器
public class LevelBuilder {
public Level BuildCampaignLevel() {
return new LevelDirector(new CampaignBuilder())
.Construct();
}
public Level BuildBossLevel() {
return new LevelDirector(new BossLevelBuilder())
.AddSpecialEffects()
.Construct();
}
}
UI系统构建
public class UIPanelBuilder {
public UIPanel BuildSettingsPanel() {
return new PanelBuilder()
.AddHeader("游戏设置")
.AddSlider("音量")
.AddDropdown("分辨率")
.AddConfirmButton()
.Build();
}
}
存档系统重构
public class SaveLoader {
public GameState LoadSave(SaveFile file) {
return new SaveBuilder(file)
.RestorePlayer()
.RestoreInventory()
.RestoreQuests()
.Build();
}
}
策略 | 实现方式 | 适用场景 |
---|---|---|
缓存Builder | 对象池管理Builder实例 | 频繁创建相似对象 |
延迟加载 | 按需加载部件资源 | 大型角色模型 |
批处理 | 合并Mesh/材质 | 大量相似对象构建 |
异步构建 | 使用UniTask异步操作 | 复杂场景加载 |
维度 | 工厂模式 | 建造者模式 |
---|---|---|
关注点 | 对象创建 | 分步构建 |
复杂度 | 低 | 高 |
产品复杂度 | 简单对象 | 复杂对象 |
构建顺序 | 无关 | 可控制 |
使用场景 | 直接创建 | 需要配置选项 |
[Optional]
特性标记可选部件public GameCharacter Build() {
if(string.IsNullOrEmpty(_character.Head))
throw new InvalidOperationException("必须构建头部");
return _character;
}
[Obsolete]
处理过时方法Q1:如何处理不同构建顺序的需求?
→ 实现多个指导者类,每个对应一种构建流程
public class QuickBuildDirector {
public GameCharacter FastBuild(ICharacterBuilder builder) {
builder.BuildBody();
builder.BuildHead();
return builder.GetResult();
}
}
Q2:如何实现动态扩展的构建步骤?
→ 使用装饰器模式增强建造者
public class EnhancedBuilder : ICharacterBuilder {
private ICharacterBuilder _wrapped;
public EnhancedBuilder(ICharacterBuilder builder) {
_wrapped = builder;
}
public void BuildHead() {
_wrapped.BuildHead();
AddSpecialEffect();
}
// 其他方法...
}
Q3:如何管理构建过程的内存?
→ 实现建造者重置接口
public interface IResettableBuilder : ICharacterBuilder {
void Reset();
}
public class ReusableBuilder : IResettableBuilder {
private GameCharacter _character;
public void Reset() => _character = new GameCharacter();
// 其他实现...
}
上一篇 【创建型之抽象工厂模式】实战:构建多主题游戏世界的核心技术解析
下一篇 【创建型之原型模式】权威指南:深拷贝与浅拷贝的抉择,Unity中高效对象克隆实战