Builder Pattern(建造者模式、构建器模式)

模式简介

       建造者模式是一种创建型设计模式,用于将对象的构建和其它行为逻辑进行分离,尤其是对于构建过程复杂的对象而言,建造者模式能帮助降低代码的复杂性。建造者模式还用于简化多参数对象的构建,可以人为对参数进行分组从而实现分步构建,根据实际需求构建具备不同初始状态的对象。

       常见的应用场景:复杂对象或配置对象的构建、表示与构建独立的对象、多参数对象以及不同初始状态的对象等。

模式结构

  1. 产品(Product): 表示被构建的复杂对象。在构建器模式中,产品是由多个部分组成的对象。

  2. 抽象构建器(Builder): 定义了构建产品的抽象接口,包括构建各个部分的方法。它通常是一个接口或者抽象类。

  3. 具体构建器(Concrete Builder): 实现了抽象构建器接口,负责构建产品的具体部分。每个具体构建器都有自己的实现方式,根据需求构建不同的表示。

  4. 指导者(Director): 负责调用具体构建器,按照一定的构建顺序来构造产品。指导者并不知道具体构建的细节,只知道调用构建器的接口。

工作原理

  1. 客户端创建指导者对象: 客户端创建一个指导者对象,并传入一个具体构建器对象。

  2. 指导者调用构建器的方法: 指导者按照一定的构建顺序调用具体构建器的方法,每个方法负责构建产品的一个部分。

  3. 构建器构建产品的各个部分: 具体构建器实现了构建产品的各个部分的方法,根据需求进行构建。

  4. 指导者获取最终产品: 完成构建过程后,指导者通过具体构建器的方法获取构建好的产品。

  5. 客户端获取最终产品: 客户端通过指导者获取构建好的产品,而不需要了解构建的具体细节。

代码示例(C#)

提示:可在本栏目的资源篇“设计模式代码示例合集”下载所有完整代码资源。

角色:Player.cs


namespace BuilderPattern;

// 角色
struct Player
{
    public string hair; // 头发
    public string eyes; // 眼睛
    public string nose; // 鼻子
    public string ears; // 耳朵
    public string mouth; // 嘴巴

    public string cloth; // 衣服
    public string pants; // 裤子
    public string shoes; // 鞋子

    public override string ToString()
    {
        return $"[Hair:{hair},Eyes:{eyes},Nose:{nose},Ears:{ears},Mouth:{mouth},Cloth:{cloth},Pants:{pants},Shoes:{shoes}]";
    }
}

角色构建器:PlayerBuilder.cs


namespace BuilderPattern;

// 角色构建器
interface IPlayerBuilder
{
    // 五官设置
    void SetFacialFeatures();
    // 穿着设置
    void SetClothing();
    // 构建
    Player Build();
}

// 男性角色构建器
class MalePlayerBuilder : IPlayerBuilder
{
    private Player player;

    public MalePlayerBuilder()
    {
        player = new Player();
    }

    public void SetFacialFeatures()
    {
        player.hair = "male hair";
        player.eyes = "male eyes";
        player.nose = "male nose";
        player.ears = "male ears";
        player.mouth = "male mouth";
    }

    public void SetClothing()
    {
        player.cloth = "male cloth";
        player.pants = "male pants";
        player.shoes = "male shoes";
    }

    public Player Build()
    {
        return player;
    }
}

// 女性角色构建器
class FemalePlayerBuilder : IPlayerBuilder
{
    private Player player;

    public FemalePlayerBuilder()
    {
        player = new Player();
    }

    public void SetFacialFeatures()
    {
        player.hair = "female hair";
        player.eyes = "female eyes";
        player.nose = "female nose";
        player.ears = "female ears";
        player.mouth = "female mouth";
    }

    public void SetClothing()
    {
        player.cloth = "female cloth";
        player.pants = "female pants";
        player.shoes = "female shoes";
    }

    public Player Build()
    {
        return player;
    }
}

角色构建器引导者:Director.cs


namespace BuilderPattern;

// 角色构建器指导者
class PlayerBuilderDirector
{
    private IPlayerBuilder playerBuilder; // 角色构建器

    public PlayerBuilderDirector(IPlayerBuilder playerBuilder)
    {
        this.playerBuilder = playerBuilder;
    }

    // 获取角色
    public Player GetPlayer()
    {
        playerBuilder.SetFacialFeatures();
        playerBuilder.SetClothing();
        return playerBuilder.Build();
    }
}

测试代码:Program.cs

// ************* 16.建造者模式测试 **************
using BuilderPattern;

MalePlayerBuilder maleBuilder = new MalePlayerBuilder();
FemalePlayerBuilder femaleBuilder = new FemalePlayerBuilder();

// 分别构建一个男性角色和女性角色
PlayerBuilderDirector maleDirector = new PlayerBuilderDirector(maleBuilder);
Player male = maleDirector.GetPlayer();
PlayerBuilderDirector femaleDirector = new PlayerBuilderDirector(femaleBuilder);
Player female = femaleDirector.GetPlayer();

// 输出两个角色的信息
Console.WriteLine(male);
Console.WriteLine(female);

代码解说

       上述代码简单模拟了在游戏中创建不同性别的默认外观的角色。涉及不同性别的角色的五官和穿着不同,而五官和穿着涉及的字段又比较多,所以可以采用建造者模式来管理角色的构建。男性和女性角色构建器分别实现角色构建器接口,并对与五官和穿着相关的字段进行初始化。再由角色构建器引导者控制构建器的调用,保证顺利构建出角色。

如果这篇文章对你有帮助,请给作者点个赞吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值