深入理解建造者模式及其在 .NET 中的实现
建造者模式(Builder Pattern)是一种创建型设计模式,其核心思想是将一个复杂对象的构建过程与其表示分离。通过这种方式,同样的构建逻辑可以产生不同的对象配置。该模式特别适用于那些构造过程复杂、且需要通过多个步骤逐步完成的对象创建场景。
核心原理
在建造者模式中,客户端不需要了解对象内部的精细组成部分以及具体的装配细节,只需指定所需的建造者类型。这种解耦机制使得系统在引入新的建造逻辑时具有极高的扩展性。具体而言,它将对象的"如何构建"与"由什么组成"进行了明确的职责划分。
以下是一个展示抽象构建流程的基础示例,演示了如何通过抽象基类定义固定的步骤序列:
// 定义抽象流程执行器
public abstract class TaskFlow
{
protected abstract void PrepareEnvironment();
protected abstract void ExecuteCoreLogic();
protected abstract void CleanupResources();
// 模板方法,控制执行顺序
public void Run()
{
PrepareEnvironment();
ExecuteCoreLogic();
CleanupResources();
}
}
// 具体业务实现
public class DataMigrationTask : TaskFlow
{
protected override void PrepareEnvironment()
{
Console.WriteLine("连接数据库并备份元数据...");
}
protected override void ExecuteCoreLogic()
{
Console.WriteLine("执行数据迁移与校验逻辑...");
}
protected override void CleanupResources()
{
Console.WriteLine("释放连接并发送执行报告...");
}
}
// 调用示例
// var task = new DataMigrationTask();
// task.Run();
复杂对象的组装与依赖注入实践
在实际的工程开发中,建造者模式常用于配置复杂的实体模型。例如,在游戏开发或系统配置中,一个对象可能包含多个属性(如硬件配置、外观参数等),且这些属性在不同场景下有不同的组合方式。结合现代 .NET 的依赖注入(DI)容器,我们可以更加优雅地管理这些建造者的生命周期。
以下代码展示了如何利用 Microsoft.Extensions.DependencyInjection 实现一个灵活的电脑配置构建系统:
using Microsoft.Extensions.DependencyInjection;
// 产品类:复杂的电脑配置
public class ComputerConfig
{
public string CPU { get; set; } = string.Empty;
public string GPU { get; set; } = string.Empty;
public string Memory { get; set; } = string.Empty;
public string Storage { get; set; } = string.Empty;
public string CaseType { get; set; } = string.Empty;
}
// 抽象建造者
public abstract class ComputerBuilder
{
protected readonly ComputerConfig _config;
protected ComputerBuilder(ComputerConfig config)
{
_config = config;
}
public abstract void SetProcessor();
public abstract void SetGraphics();
public abstract void SetMemorySize();
public abstract void SetStorageDisk();
public abstract void SetChassis();
public ComputerConfig GetResult() => _config;
}
// 具体建造者:工作站配置
public class WorkstationBuilder : ComputerBuilder
{
public WorkstationBuilder(ComputerConfig config) : base(config) { }
public override void SetProcessor() => _config.CPU = "Threadripper 5995WX";
public override void SetGraphics() => _config.GPU = "RTX A6000";
public override void SetMemorySize() => _config.Memory = "256GB ECC DDR4";
public override void SetStorageDisk() => _config.Storage = "4TB NVMe SSD";
public override void SetChassis() => _config.CaseType = "Full Tower";
}
// 具体建造者:办公电脑配置
public class OfficePCBuilder : ComputerBuilder
{
public OfficePCBuilder(ComputerConfig config) : base(config) { }
public override void SetProcessor() => _config.CPU = "Core i5-12400";
public override void SetGraphics() => _config.GPU = "Integrated Graphics";
public override void SetMemorySize() => _config.Memory = "16GB DDR4";
public override void SetStorageDisk() => _config.Storage = "512GB SATA SSD";
public override void SetChassis() => _config.CaseType = "Mini ITX";
}
// 指挥者:负责构建顺序
public class AssemblyDirector
{
private readonly ComputerBuilder _builder;
public AssemblyDirector(ComputerBuilder builder)
{
_builder = builder;
}
public ComputerConfig Construct()
{
_builder.SetProcessor();
_builder.SetGraphics();
_builder.SetMemorySize();
_builder.SetStorageDisk();
_builder.SetChassis();
return _builder.GetResult();
}
}
// 客户端调用与 DI 注册
var services = new ServiceCollection();
// 注册具体建造者和指挥者
services.AddTransient<ComputerBuilder, WorkstationBuilder>();
services.AddTransient<AssemblyDirector>();
services.AddTransient<ComputerConfig>();
var serviceProvider = services.BuildServiceProvider();
// 从容器中获取指挥者并执行构建
var director = serviceProvider.GetRequiredService<AssemblyDirector>();
var myPC = director.Construct();
Console.WriteLine("--- 电脑配置单 ---");
Console.WriteLine($"处理器: {myPC.CPU}");
Console.WriteLine($"显卡: {myPC.GPU}");
Console.WriteLine($"内存: {myPC.Memory}");
Console.WriteLine($"硬盘: {myPC.Storage}");
Console.WriteLine($"机箱: {myPC.CaseType}");
应用总结
建造者模式通过将构建逻辑封装在具体的 Builder 类中,不仅简化了 Director 的逻辑,还允许我们在不修改现有代码的情况下,通过增加新的 Builder 子类来扩展系统功能。在涉及 DI 容器时,这种模式能有效地解决复杂对象生命周期管理和依赖注入的冲突,使系统架构更加健壮且易于测试。