在C# 中使用建造者模式

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

相关推荐
海的透彻3 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat4 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle
后台模板学习4 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
w_zero_one4 小时前
算法--构造
java·数据结构·算法
SL_staff5 小时前
制造业订单交付崩盘?用四层协同框架重建交付可信度(技术实践)
java·产品·全栈
SL_staff5 小时前
打破风控迭代死循环:用决策编排重构业务与技术协作链路
java·产品·全栈
Mikko76 小时前
Redis 连接数满了服务端有错误信息吗?连接数不增加却命令超时?6.2 实测连接池、超时与大 key 怎么判定
java·spring boot·redis·后端
.Bryce.6 小时前
从零到一开发技术名词大全:从需求分析到 AI Agent 工程
java·网络·人工智能·agent·需求分析·agent评测
SL_staff6 小时前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
代码山河8 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目