0x05. 建造者模式
建造者模式
在Unity中使用C#实现建造者模式,核心是解决「复杂对象的分步构建与表示分离」问题。结合游戏开发典型场景——自定义游戏角色(包含外观、属性、技能等多个组件),能直观体现建造者模式“分步组装、灵活定制”的核心特性(比如创建“肉盾战士”“爆发法师”等不同配置的角色,复用同一套构建流程)
一、核心思路(建造者模式)
| 角色 | 对应实现类 | 作用 |
|---|---|---|
| 产品 | GameCharacter(游戏角色) |
复杂对象,包含多个组件(外观、属性、技能、装备) |
| 抽象建造者 | ICharacterBuilder(角色建造者接口) |
定义构建产品各个组件的抽象方法(BuildAppearance/Attributes/Skills等) |
| 具体建造者 | WarriorBuilder/MageBuilder |
实现抽象建造者,定制不同角色的组件构建逻辑(肉盾战士/爆发法师) |
| 指挥者 | CharacterDirector(角色指挥者) |
封装构建流程(固定“外观→属性→技能→装备”的构建顺序),客户端只需调用指挥者,无需关心步骤 |
| 客户端 | GameManager(挂载到Unity物体) |
指定具体建造者,通过指挥者完成复杂对象的构建 |
二、完整代码实现
1. 产品类:GameCharacter(复杂对象——游戏角色)
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 复杂产品:游戏角色(包含多个组件)
/// </summary>
public class GameCharacter
{
// 角色基础信息
public string Name { get; set; }
public string RoleType { get; set; } // 战士/法师/刺客
// 组件1:外观
public string Appearance { get; set; } // 模型/皮肤
// 组件2:属性
public int Hp { get; set; }
public int Attack { get; set; }
public int Defense { get; set; }
// 组件3:技能
public List<string> Skills { get; set; } = new List<string>();
// 组件4:装备
public string Weapon { get; set; }
public string Armor { get; set; }
// 展示角色配置
public void ShowInfo()
{
Debug.Log($"========== 角色配置完成 ==========\n" +
$"角色名称:{Name}\n" +
$"角色类型:{RoleType}\n" +
$"外观:{Appearance}\n" +
$"属性:HP={Hp} | 攻击={Attack} | 防御={Defense}\n" +
$"技能:{string.Join("、", Skills)}\n" +
$"装备:{Weapon} + {Armor}\n" +
"==================================");
}
}
2. 抽象建造者:ICharacterBuilder(定义构建步骤)
/// <summary>
/// 抽象建造者:定义构建角色各个组件的方法
/// </summary>
public interface ICharacterBuilder
{
// 初始化角色基础信息
void InitBaseInfo(string name);
// 构建外观
void BuildAppearance();
// 构建属性
void BuildAttributes();
// 构建技能
void BuildSkills();
// 构建装备
void BuildEquipment();
// 获取最终构建的角色
GameCharacter GetResult();
}
3. 具体建造者:定制不同角色(战士/法师)
3.1 肉盾战士建造者:WarriorBuilder
/// <summary>
/// 具体建造者1:肉盾战士建造者(高血量、高防御、近战技能)
/// </summary>
public class WarriorBuilder : ICharacterBuilder
{
private GameCharacter _character = new GameCharacter();
public void InitBaseInfo(string name)
{
_character.Name = name;
_character.RoleType = "肉盾战士";
Debug.Log($"[战士建造者] 初始化角色:{name}");
}
public void BuildAppearance()
{
// Unity特有逻辑:可在此加载战士预制体/皮肤
_character.Appearance = "重甲战士模型 + 红色皮肤";
Debug.Log($"[战士建造者] 构建外观:{_character.Appearance}");
}
public void BuildAttributes()
{
_character.Hp = 2000; // 高血量
_character.Attack = 300;
_character.Defense = 800; // 高防御
Debug.Log($"[战士建造者] 构建属性:HP={_character.Hp} 攻击={_character.Attack} 防御={_character.Defense}");
}
public void BuildSkills()
{
_character.Skills.AddRange(new[] { "盾击", "嘲讽", "生命回复", "范围劈砍" });
Debug.Log($"[战士建造者] 构建技能:{string.Join("、", _character.Skills)}");
}
public void BuildEquipment()
{
_character.Weapon = "巨型战斧";
_character.Armor = "熔岩重甲";
Debug.Log($"[战士建造者] 构建装备:{_character.Weapon} + {_character.Armor}");
}
public GameCharacter GetResult()
{
return _character;
}
}
3.2 爆发法师建造者:MageBuilder
/// <summary>
/// 具体建造者2:爆发法师建造者(低血量、高攻击、法术技能)
/// </summary>
public class MageBuilder : ICharacterBuilder
{
private GameCharacter _character = new GameCharacter();
public void InitBaseInfo(string name)
{
_character.Name = name;
_character.RoleType = "爆发法师";
Debug.Log($"[法师建造者] 初始化角色:{name}");
}
public void BuildAppearance()
{
_character.Appearance = "法袍模型 + 蓝色特效皮肤";
Debug.Log($"[法师建造者] 构建外观:{_character.Appearance}");
}
public void BuildAttributes()
{
_character.Hp = 800; // 低血量
_character.Attack = 1200; // 高攻击
_character.Defense = 200;
Debug.Log($"[法师建造者] 构建属性:HP={_character.Hp} 攻击={_character.Attack} 防御={_character.Defense}");
}
public void BuildSkills()
{
_character.Skills.AddRange(new[] { "火球术", "冰锥术", "法术暴击", "瞬移" });
Debug.Log($"[法师建造者] 构建技能:{string.Join("、", _character.Skills)}");
}
public void BuildEquipment()
{
_character.Weapon = "烈焰法杖";
_character.Armor = "秘法披风";
Debug.Log($"[法师建造者] 构建装备:{_character.Weapon} + {_character.Armor}");
}
public GameCharacter GetResult()
{
return _character;
}
}
4. 指挥者:CharacterDirector(封装构建流程)
/// <summary>
/// 指挥者:固定角色构建的流程(外观→属性→技能→装备),解耦构建步骤与客户端
/// </summary>
public class CharacterDirector
{
private readonly ICharacterBuilder _builder;
// 传入具体建造者
public CharacterDirector(ICharacterBuilder builder)
{
_builder = builder;
}
/// <summary>
/// 构建完整角色(固定流程)
/// </summary>
/// <param name="name">角色名称</param>
/// <returns>构建完成的角色</returns>
public GameCharacter ConstructCharacter(string name)
{
Debug.Log("\n========== 开始构建角色 ==========");
_builder.InitBaseInfo(name);
_builder.BuildAppearance();
_builder.BuildAttributes();
_builder.BuildSkills();
_builder.BuildEquipment();
Debug.Log("========== 角色构建完成 ==========\n");
return _builder.GetResult();
}
}
5. 客户端调用:GameManager(Unity场景挂载)
using UnityEngine;
/// <summary>
/// 游戏管理器(客户端):通过指挥者+建造者创建定制化角色
/// </summary>
public class GameManager : MonoBehaviour
{
private void Start()
{
// ========== 1. 构建肉盾战士 ==========
// 步骤1:创建具体建造者(战士)
ICharacterBuilder warriorBuilder = new WarriorBuilder();
// 步骤2:创建指挥者,传入建造者
CharacterDirector warriorDirector = new CharacterDirector(warriorBuilder);
// 步骤3:指挥者执行构建流程,获取角色
GameCharacter warrior = warriorDirector.ConstructCharacter("钢铁守卫");
// 展示角色信息
warrior.ShowInfo();
// ========== 2. 构建爆发法师 ==========
Debug.Log("\n-----------------------------------\n");
ICharacterBuilder mageBuilder = new MageBuilder();
CharacterDirector mageDirector = new CharacterDirector(mageBuilder);
GameCharacter mage = mageDirector.ConstructCharacter("寒冰法师");
mage.ShowInfo();
}
}
三、Unity运行效果
将GameManager挂载到场景任意物体(如MainCamera),运行后控制台输出:
========== 开始构建角色 ==========
[战士建造者] 初始化角色:钢铁守卫
[战士建造者] 构建外观:重甲战士模型 + 红色皮肤
[战士建造者] 构建属性:HP=2000 攻击=300 防御=800
[战士建造者] 构建技能:盾击、嘲讽、生命回复、范围劈砍
[战士建造者] 构建装备:巨型战斧 + 熔岩重甲
========== 角色构建完成 ==========
========== 角色配置完成 ==========
角色名称:钢铁守卫
角色类型:肉盾战士
外观:重甲战士模型 + 红色皮肤
属性:HP=2000 | 攻击=300 | 防御=800
技能:盾击、嘲讽、生命回复、范围劈砍
装备:巨型战斧 + 熔岩重甲
==================================
-----------------------------------
========== 开始构建角色 ==========
[法师建造者] 初始化角色:寒冰法师
[法师建造者] 构建外观:法袍模型 + 蓝色特效皮肤
[法师建造者] 构建属性:HP=800 攻击=1200 防御=200
[法师建造者] 构建技能:火球术、冰锥术、法术暴击、瞬移
[法师建造者] 构建装备:烈焰法杖 + 秘法披风
========== 角色构建完成 ==========
========== 角色配置完成 ==========
角色名称:寒冰法师
角色类型:爆发法师
外观:法袍模型 + 蓝色特效皮肤
属性:HP=800 | 攻击=1200 | 防御=200
技能:火球术、冰锥术、法术暴击、瞬移
装备:烈焰法杖 + 秘法披风
==================================
四、Unity场景扩展(贴合实际开发)
1. 新增角色类型(刺客)
建造者模式扩展新角色极便捷,仅需新增具体建造者,无需修改指挥者和原有代码:
/// <summary>
/// 新增具体建造者:刺客建造者(高攻速、隐身技能)
/// </summary>
public class AssassinBuilder : ICharacterBuilder
{
private GameCharacter _character = new GameCharacter();
public void InitBaseInfo(string name)
{
_character.Name = name;
_character.RoleType = "敏捷刺客";
}
public void BuildAppearance() => _character.Appearance = "潜行模型 + 黑色皮肤";
public void BuildAttributes()
{
_character.Hp = 1000;
_character.Attack = 700;
_character.Defense = 300;
}
public void BuildSkills() => _character.Skills.AddRange(new[] { "隐身", "背刺", "暴击连击", "致盲" });
public void BuildEquipment()
{
_character.Weapon = "淬毒匕首";
_character.Armor = "暗影皮甲";
}
public GameCharacter GetResult() => _character;
}
// 客户端调用新增刺客
private void Start()
{
// ... 原有战士/法师代码
Debug.Log("\n-----------------------------------\n");
ICharacterBuilder assassinBuilder = new AssassinBuilder();
CharacterDirector assassinDirector = new CharacterDirector(assassinBuilder);
GameCharacter assassin = assassinDirector.ConstructCharacter("影刃");
assassin.ShowInfo();
}
2. 结合Unity预制体与资源加载
实际项目中,可在BuildAppearance方法中加载角色预制体、设置材质/特效:
public void BuildAppearance()
{
// 加载Resources下的战士预制体
GameObject warriorPrefab = Resources.Load<GameObject>("Prefabs/Warrior");
if (warriorPrefab != null)
{
GameObject warriorObj = Instantiate(warriorPrefab, Vector3.zero, Quaternion.identity);
// 设置皮肤材质
Renderer renderer = warriorObj.GetComponentInChildren<Renderer>();
renderer.material = Resources.Load<Material>("Materials/RedWarriorSkin");
_character.Appearance = "重甲战士模型 + 红色皮肤(已加载预制体)";
}
}
3. 动态调整构建流程(可选步骤)
指挥者可提供“精简构建”方法(比如只构建基础属性,不加载技能/装备):
public class CharacterDirector
{
// ... 原有代码
/// <summary>
/// 精简构建:仅初始化+外观+属性(用于新手角色)
/// </summary>
public GameCharacter ConstructSimpleCharacter(string name)
{
Debug.Log("\n========== 开始精简构建角色 ==========");
_builder.InitBaseInfo(name);
_builder.BuildAppearance();
_builder.BuildAttributes();
Debug.Log("========== 精简构建完成 ==========\n");
return _builder.GetResult();
}
}
// 客户端调用精简构建
GameCharacter noviceWarrior = warriorDirector.ConstructSimpleCharacter("新手战士");
noviceWarrior.ShowInfo(); // 技能/装备为空,仅基础信息
4. 链式调用优化(简化客户端代码)
可将建造者改为链式调用,省去指挥者(适合灵活定制步骤的场景):
public class WarriorBuilder : ICharacterBuilder
{
// ... 原有字段/方法
// 链式调用扩展
public WarriorBuilder WithName(string name)
{
InitBaseInfo(name);
return this;
}
public WarriorBuilder WithAppearance()
{
BuildAppearance();
return this;
}
public WarriorBuilder WithAttributes()
{
BuildAttributes();
return this;
}
// 最终构建
public GameCharacter Build()
{
return _character;
}
}
// 客户端链式调用
GameCharacter customWarrior = new WarriorBuilder()
.WithName("自定义战士")
.WithAppearance()
.WithAttributes()
.Build();
五、建造者模式核心优势(Unity场景)
- 分步构建,灵活定制:复杂角色的组件(外观/属性/技能)可分步构建,支持“完整构建”“精简构建”等不同流程;
- 解耦构建与表示:客户端无需知道角色的具体构建细节,只需通过指挥者/建造者获取最终对象;
- 复用构建流程:新增角色(刺客/射手)时,仅需新增具体建造者,指挥者的构建流程可完全复用;
- 避免多参数构造器:相比
GameCharacter的多参数构造器(如new GameCharacter("钢铁守卫", 2000, 300, 800, ...)),建造者模式更清晰、易维护。
六、建造者模式 vs 工厂模式(Unity场景对比)
| 模式 | 核心差异 | Unity适用场景 |
|---|---|---|
| 工厂模式 | 关注“创建对象”,一键生成 | 简单对象创建(单个道具、基础敌人) |
| 建造者模式 | 关注“组装对象”,分步定制 | 复杂对象创建(角色定制、关卡配置、UI面板组装) |
建造者模式是Unity中开发“高定制化复杂对象”的首选模式,比如角色创建、关卡生成、复杂UI面板组装(包含按钮、文本、图标等多个组件)都非常适用。