在C# 中使用建造者模式
C# 的建造者模式比java强大的多, 它提供了 return this的语法, 可以让建造者模式使用链式语法. Action关键字可以使配置更加灵活
举例 如下:
public class ComputerBuilderFactory{public static IComputerBuilder CreateBuilder(){return new ComputerBuilder();}}
public interface IComputerBuilder{Computer Build();IComputerBuilder SetHost(string hostName);IComputerBuilder SetIp(string ip);IComputerBuilder SetHardWare(Action<HardWareWrapper> config);}
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;}}
public class HardWare{public string Cpu { get; set; } = string.Empty;public string Memory { get; set; } = string.Empty;public string Storage { get; set; } = string.Empty;}
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;}}
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