初学者,自用笔记

把复杂对象的 “创建过程” 和 “部件组装” 分开,一步步拼出对象,不用直接 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();
    }
}

待实现-自定义主角等具体例子