.NET-9-计算机思想-构建器模式(Builder Pattern)

用户云卷云舒  金牌会员 | 2024-6-21 08:25:10 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 899|帖子 899|积分 2697

目次

前言

做个自由仔。
学习参考

过程


  • 原由:
    一开始只是想查查链式调用原理,以为是要继承什么接口,实现什么方法才可以实现;像可以实现foreach;一查好简单;哎~,是平常思考少了;成代码机器了,我冒昧了。
  1. public class Person
  2. {
  3.     private string _name;
  4.     private int _age;
  5.     public Person SetName(string name)
  6.     {
  7.         _name = name;
  8.         return this; // 返回当前对象以支持链式调用
  9.     }
  10.     public Person SetAge(int age)
  11.     {
  12.         _age = age;
  13.         return this; // 返回当前对象以支持链式调用
  14.     }
  15.     public void Display()
  16.     {
  17.         Console.WriteLine($"Name: {_name}, Age: {_age}");
  18.     }
  19. }
  20. //调用:
  21. Person person = new Person();        
  22. // 链式调用示例
  23. person.SetName("John")
  24.         .SetAge(30)
  25.         .Display();
复制代码

  • 然后我就看到了构建器模式;又一次明白了一次(歉仄从前的忘了;)
    然后又问了问优点,实用场景;
  1. 优点:
  2. - 可读性高: 构建器模式使代码更加易读,特别是在创建复杂对象时。
  3. - 灵活性: 可以很容易地添加或删除属性,而不需要更改客户端代码。
  4. - 不可变对象: 通过构建器模式可以创建不可变对象(所有属性在对象创建后都不能更改),提高了代码的可靠性。
  5. 适用场景:
  6. - 需要创建的对象具有很多可选参数时。
  7. - 对象的构建过程复杂时,例如需要分步骤进行初始化。
  8. - 需要确保对象在创建时是有效的,并且不希望对象在创建后改变。
  9. 说实话,一开始我是没理解这个灵活性的,因为我想到了直接传递一个参数实体;
  10. 那岂不更方便,结果后面给我说常常是两者结合,来构建复杂的对象;好吧;
  11. 还有那个可读性;这样,我的对象初始化也可以呀(new person{})
  12. public class Person
  13. {
  14.     private string _name;
  15.     private int _age;
  16.     private string _address;
  17.     private Person() { }
  18.     public class Builder
  19.     {
  20.         private Person _person = new Person();
  21.         public Builder SetName(string name)
  22.         {
  23.             _person._name = name;
  24.             return this;
  25.         }
  26.         public Builder SetAge(int age)
  27.         {
  28.             _person._age = age;
  29.             return this;
  30.         }
  31.         public Builder SetAddress(string address)
  32.         {
  33.             _person._address = address;
  34.             return this;
  35.         }
  36.         public Person Build()
  37.         {
  38.             // 可以在这里添加对象验证逻辑
  39.             // 如:if (string.IsNullOrEmpty(_person._name))  
  40.             // throw new InvalidOperationException("Make cannot be null or empty");
  41.             return _person;
  42.         }
  43.     }
  44. }
  45. //调用:
  46. Person person = new Person.Builder()
  47.                     .SetName("John")
  48.                     .SetAge(30)
  49.                     .SetAddress("123 Main St")
  50.                     .Build();
  51. Console.WriteLine($"Name: {person._name}, Age: {person._age}, Address: {person._address}");
  52. // 输出: Name: John, Age: 30, Address: 123 Main St
  53. -------------------------------------------------------------------
  54. //使用参数对象
  55. public class PersonParameters
  56. {
  57.     public string Name { get; set; }
  58.     public int Age { get; set; }
  59.     public string Address { get; set; }
  60. }
  61. public class Person
  62. {
  63.     private string _name;
  64.     private int _age;
  65.     private string _address;
  66.     private Person() { }
  67.     public class Builder
  68.     {
  69.         private PersonParameters _parameters = new PersonParameters();
  70.         public Builder SetName(string name)
  71.         {
  72.             _parameters.Name = name;
  73.             return this;
  74.         }
  75.         public Builder SetAge(int age)
  76.         {
  77.             _parameters.Age = age;
  78.             return this;
  79.         }
  80.         public Builder SetAddress(string address)
  81.         {
  82.             _parameters.Address = address;
  83.             return this;
  84.         }
  85.         public Person Build()
  86.         {
  87.             //构造对象初始化
  88.             Person _person=new Person
  89.             {
  90.                 Name=_parameters.Name,
  91.                 Age=_parameters.Age,
  92.                 Name=_parameters.Name,
  93.             }
  94.             return _person;
  95.         }
  96.     }
  97. }
复制代码

  • 后面我就想到了Serilog;那个初始化好像就是链式的;构建器模式耶;(主机构建那里都是,歉仄了)
  1. Log.Logger = new LoggerConfiguration()
  2.             .MinimumLevel.Debug()
  3.             .WriteTo.Console()
  4.             .WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day)
  5.             .CreateLogger();
复制代码

  • 接着我继承问:.MinimumLevel.Debug() 这里的MinimumLevel是一个类;而Debug()是一个静态方法么;
    我是想的MinimumLevel静态类,Debug()是一个静态方法;
    好吧我的想法是错的;是中心加了一个类来设置一些信息;大概中心类的扩展方法来的
  1. public class LoggerConfiguration
  2. {
  3.     public LoggerMinimumLevelConfiguration MinimumLevel { get; }
  4.     public LoggerSinkConfiguration WriteTo { get; }
  5.     // 其他配置方法和属性...
  6.     public LoggerConfiguration()
  7.     {
  8.         MinimumLevel = new LoggerMinimumLevelConfiguration(this);
  9.         WriteTo = new LoggerSinkConfiguration(this);
  10.     }
  11. }
  12. public class LoggerMinimumLevelConfiguration
  13. {
  14.     private readonly LoggerConfiguration _loggerConfiguration;
  15.     public LoggerMinimumLevelConfiguration(LoggerConfiguration loggerConfiguration)
  16.     {
  17.         _loggerConfiguration = loggerConfiguration;
  18.     }
  19.     public LoggerConfiguration Debug()
  20.     {
  21.         _loggerConfiguration.MinimumLevelControlledBy(new LoggingLevelSwitch(LogEventLevel.Debug));
  22.         return _loggerConfiguration;
  23.     }
  24.     // 其他级别设置方法...
  25. }
  26. ----------
  27. //,WriteTo.Console()
  28. //使用扩展方法
  29. public static class LoggerSinkConfigurationExtensions
  30. {
  31.     public static LoggerConfiguration Console(this LoggerSinkConfiguration sinkConfiguration)
  32.     {
  33.         //打印
  34.         return sinkConfiguration.Sink(new ConsoleSink());
  35.     }
  36.     // 其他扩展方法...
  37. }
  38. //使用中间类
  39. public class LoggerSinkConfiguration
  40. {
  41.     private readonly LoggerConfiguration _loggerConfiguration;
  42.     public LoggerSinkConfiguration(LoggerConfiguration loggerConfiguration)
  43.     {
  44.         _loggerConfiguration = loggerConfiguration;
  45.     }
  46.     public LoggerConfiguration Console()
  47.     {
  48.         // 配置控制台输出
  49.         return _loggerConfiguration;
  50.     }
  51.     public LoggerConfiguration File(string path, RollingInterval rollingInterval)
  52.     {
  53.         // 配置文件输出及滚动策略
  54.         return _loggerConfiguration;
  55.     }
  56.     // 其他输出目标配置方法...
  57. }
复制代码

  • 然后我又看了一下,回顾了我收藏的资源,果然我适合当咸鱼。
总结:

主要了为了记忆深刻一些;感觉有了那些大模型后更加懒了,不仅不主动去了解一些知识,也觉得从前写都没多大意义;留着留个念想;
觉得反正ai一下么,不手到擒来(想法是错的,使人懒惰,技术很难精进的);但是如果当个小喽喽,真话说无所谓了,我们很自信,我们也要掂量掂量自己的分量。
当然我也希望可以直接大跃进到,脑机接口民用,直接动脑子搜刮(在思维上),直接读取相关数据就好了,也不能都记取,毕竟内存还是有限的,脑容量是硬盘,记忆是内存。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表