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
    评论
Builder模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 统设计中,有时候面临着一个“复杂系统”的创建工作,该对象通常由各个部分的子对象用一定的算法构成,或者说按一定的步骤组合而成;这些的算法和步骤是稳定的,而构成这个对象的子对象却经常由于需求改变而发生变化,此时我们可以选择使用Builder模式。尽管Builder模式相当容易让人误解,但我认为这几点应该是不会有错的。因此我个人认为Builder模式中要好好把握如下几点 1. 需要创建的对象是复杂对象 2. 对象的创建过程是一步步创建(即:可能由于过程的不同而导致有不同的对象展示) 3. 明确建造者(Builder)、具体建造者(Concrete Builder)、指导者(Director)、产品(Product)之间的职责和联系。 ◆建造者(Builder): 给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是 具体建造者(ConcreteBuilder):具体建造者类必须实现这个接口所要求的方法:一个是建造方法,另一个是结果返还方法。 ◆具体建造者(Concrete Builder): 担任这个角色的是于应用程序紧密相关的类,它们在应用程序调用下创建产品实例。这个角色主要完成的任务包括: ■实现Builder角色提供的接口,一步一步完成创建产品实例的过程。 ■在建造过程完成后,提供产品的实例。 ◆指导者(Director): 担任这个角色的类调用具体建造者角色以创建产品对象。导演者并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者对象。 ◆产品(Product): 产品便是建造中的复杂对象。 详细见博客 http://blog.csdn.net/xiaoting451292510/article/details/8330462

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值