C# 的建造者模式比java强大的多, 它提供了 return this的语法, 可以让建造者模式使用链式语法. Action关键字可以使配置更加灵活
举例 如下:
csharp
public class ComputerBuilderFactory
{
public static IComputerBuilder CreateBuilder()
{
return new ComputerBuilder();
}
}
csharp
public interface IComputerBuilder
{
Computer Build();
IComputerBuilder SetHost(string hostName);
IComputerBuilder SetIp(string ip);
IComputerBuilder SetHardWare(Action<HardWareWrapper> config);
}
csharp
public class HardWareWrapper
{
private readonly HardWare hardWare;
public HardWareWrapper(HardWare hardWare)
{
this.hardWare = hardWare;
}
public HardWareWrapper SetCpu(string cpu)
{
hardWare.Cpu = cpu;
return this;
}
public HardWareWrapper SetMemory(string memory)
{
hardWare.Memory = memory;
return this;
}
public HardWareWrapper SetStorage(string storage)
{
hardWare.Storage = storage;
return this;
}
}
csharp
public class HardWare
{
public string Cpu { get; set; } = string.Empty;
public string Memory { get; set; } = string.Empty;
public string Storage { get; set; } = string.Empty;
}
csharp
public class ComputerBuilder : IComputerBuilder
{
private HardWare hardWare = new();
private string hostName = string.Empty;
private string ip = string.Empty;
public Computer Build()
{
return new(hostName, ip, hardWare);
}
public IComputerBuilder SetHardWare(Action<HardWareWrapper> config)
{
HardWareWrapper wrapper = new HardWareWrapper(hardWare);
config?.Invoke(wrapper);
return this;
}
public IComputerBuilder SetHost(string hostName)
{
this.hostName = hostName ?? string.Empty;
return this;
}
public IComputerBuilder SetIp(string ip)
{
this.ip = ip ?? string.Empty;
return this;
}
}
csharp
public class Computer
{
public Computer(string ip, string host, HardWare myHardWare)
{
Ip = ip;
Host = host;
MyHardWare = myHardWare;
}
public string Ip { get; }
public string Host { get; }
public HardWare MyHardWare { get; }
public override string ToString()
{
return $"ip:{Ip}, host:{Host}, Memory:{MyHardWare.Memory}, Storage:{MyHardWare.Storage}, Cpu:{MyHardWare.Cpu}";
}
}
可以在builder 中 写set方法, 返回return
在computer 实体类中通过构造函数传入
HardWare的属性配置可以用Action 传入HardWare 类型的参数进行配置, HardWare和其他字段一起以private字段的形式留在ComputerBuilder 中, 使用HardWareWrapper 配置 HardWare, 构造器传入HardWareWrapper 的 HardWare