初学者,自用笔记
把复杂对象的 “创建过程” 和 “部件组装” 分开,一步步拼出对象,不用直接 new 复杂对象。
产品
Entity
public class Entity
{
public string Name { get; private set; }
public int Hp { get; private set; }
public float MoveSpeed { get; private set; }
public GameObject GameObject { get; private set; }
public Entity(string name, int hp, float moveSpeed, GameObject gameObject)
{
Name = name;
Hp = hp;
MoveSpeed = moveSpeed;
GameObject = gameObject;
}
public override string ToString()
{
return $"Entity(Name={Name}, Hp={Hp}, MoveSpeed={MoveSpeed}, Go={(GameObject != null ? GameObject.name : "null")})";
}
}
抽象生成器
抽象生成器(Builder):规定构建步骤
public abstract class EntityBuilder
{
protected string _name;
protected int _hp;
protected float _moveSpeed;
protected GameObject _gameObject;
// 分步骤构建
public abstract EntityBuilder Reset();
public abstract EntityBuilder SetName(string name);
public abstract EntityBuilder SetStats(int hp, float moveSpeed);
public abstract EntityBuilder CreateGameObject();
public abstract EntityBuilder AddComponents();
// 返回产品
public abstract Entity Build();
}
具体生成器
PlayerBuilder
public class PlayerBuilder : EntityBuilder
{
public override EntityBuilder Reset()
{
_name = "Player";
_hp = 100;
_moveSpeed = 5f;
_gameObject = null;
return this;
}
public override EntityBuilder SetName(string name)
{
_name = string.IsNullOrWhiteSpace(name) ? "Player" : name;
return this;
}
public override EntityBuilder SetStats(int hp, float moveSpeed)
{
_hp = Mathf.Max(1, hp);
_moveSpeed = Mathf.Max(0f, moveSpeed);
return this;
}
public override EntityBuilder CreateGameObject()
{
if (_gameObject != null)
{
Object.Destroy(_gameObject);
}
_gameObject = new GameObject(_name);
return this;
}
......
}
导演/主管
导演/主管(Director):决定“构建顺序”和“构建方案”
public class EntityDirector
{
// 标准玩家:按既定步骤
public Entity ConstructStandardPlayer(EntityBuilder builder, string name)
{
return builder
.Reset()
.SetName(name)
.SetStats(hp: 120, moveSpeed: 6.5f)
.CreateGameObject()
.AddComponents()
.Build();
}
// 肉盾玩家:另一个构建方案
public Entity ConstructTankPlayer(EntityBuilder builder, string name)
{
return builder
.Reset()
.SetName(name)
.SetStats(hp: 300, moveSpeed: 3.5f)
.CreateGameObject()
.AddComponents()
.Build();
}
}

京公网安备 11010502036488号