模式简介
建造者模式是一种创建型设计模式,用于将对象的构建和其它行为逻辑进行分离,尤其是对于构建过程复杂的对象而言,建造者模式能帮助降低代码的复杂性。建造者模式还用于简化多参数对象的构建,可以人为对参数进行分组从而实现分步构建,根据实际需求构建具备不同初始状态的对象。
常见的应用场景:复杂对象或配置对象的构建、表示与构建独立的对象、多参数对象以及不同初始状态的对象等。
模式结构
-
产品(Product): 表示被构建的复杂对象。在构建器模式中,产品是由多个部分组成的对象。
-
抽象构建器(Builder): 定义了构建产品的抽象接口,包括构建各个部分的方法。它通常是一个接口或者抽象类。
-
具体构建器(Concrete Builder): 实现了抽象构建器接口,负责构建产品的具体部分。每个具体构建器都有自己的实现方式,根据需求构建不同的表示。
-
指导者(Director): 负责调用具体构建器,按照一定的构建顺序来构造产品。指导者并不知道具体构建的细节,只知道调用构建器的接口。
工作原理
-
客户端创建指导者对象: 客户端创建一个指导者对象,并传入一个具体构建器对象。
-
指导者调用构建器的方法: 指导者按照一定的构建顺序调用具体构建器的方法,每个方法负责构建产品的一个部分。
-
构建器构建产品的各个部分: 具体构建器实现了构建产品的各个部分的方法,根据需求进行构建。
-
指导者获取最终产品: 完成构建过程后,指导者通过具体构建器的方法获取构建好的产品。
-
客户端获取最终产品: 客户端通过指导者获取构建好的产品,而不需要了解构建的具体细节。
代码示例(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);
代码解说
上述代码简单模拟了在游戏中创建不同性别的默认外观的角色。涉及不同性别的角色的五官和穿着不同,而五官和穿着涉及的字段又比较多,所以可以采用建造者模式来管理角色的构建。男性和女性角色构建器分别实现角色构建器接口,并对与五官和穿着相关的字段进行初始化。再由角色构建器引导者控制构建器的调用,保证顺利构建出角色。
如果这篇文章对你有帮助,请给作者点个赞吧!