.NET-9-計算機思想-構建器模式(Builder Pattern)

cactus9發表於2024-06-21

目錄
  • 前言
  • 學習參考
  • 過程
  • 總結:

前言

做個自由仔。

學習參考

  1. ChatGpt;
  2. https://www.cnblogs.com/zhili/p/DesignPatternSummery.html(大佬的,看了好多次)

過程

  1. 原由:
    一開始只是想查查鏈式呼叫原理,以為是要繼承什麼介面,實現什麼方法才可以實現;像可以實現foreach;一查好簡單;哎~,是平時思考少了;成程式碼機器了,我冒昧了。
public class Person
{
    private string _name;
    private int _age;
    public Person SetName(string name)
    {
        _name = name;
        return this; // 返回當前物件以支援鏈式呼叫
    }
    public Person SetAge(int age)
    {
        _age = age;
        return this; // 返回當前物件以支援鏈式呼叫
    }
    public void Display()
    {
        Console.WriteLine($"Name: {_name}, Age: {_age}");
    }
}
//呼叫:
Person person = new Person();        
// 鏈式呼叫示例
person.SetName("John")
        .SetAge(30)
        .Display();
  1. 然後我就看到了構建器模式;又一次理解了一次(抱歉以前的忘了;)
    然後又問了問優點,適用場景;
優點:
- 可讀性高: 構建器模式使程式碼更加易讀,特別是在建立複雜物件時。
- 靈活性: 可以很容易地新增或刪除屬性,而不需要更改客戶端程式碼。
- 不可變物件: 透過構建器模式可以建立不可變物件(所有屬性在物件建立後都不能更改),提高了程式碼的可靠性。
適用場景:
- 需要建立的物件具有很多可選引數時。
- 物件的構建過程複雜時,例如需要分步驟進行初始化。
- 需要確保物件在建立時是有效的,並且不希望物件在建立後改變。
說實話,一開始我是沒理解這個靈活性的,因為我想到了直接傳遞一個引數實體;
那豈不更方便,結果後面給我說常常是兩者結合,來構建複雜的物件;好吧;
還有那個可讀性;這樣,我的物件初始化也可以呀(new person{})

public class Person
{
    private string _name;
    private int _age;
    private string _address;
    private Person() { }
    public class Builder
    {
        private Person _person = new Person();
        public Builder SetName(string name)
        {
            _person._name = name;
            return this;
        }
        public Builder SetAge(int age)
        {
            _person._age = age;
            return this;
        }
        public Builder SetAddress(string address)
        {
            _person._address = address;
            return this;
        }
        public Person Build()
        {
            // 可以在這裡新增物件驗證邏輯
            // 如:if (string.IsNullOrEmpty(_person._name))  
            // throw new InvalidOperationException("Make cannot be null or empty");
            return _person;
        }
    }
}
//呼叫:
Person person = new Person.Builder()
                    .SetName("John")
                    .SetAge(30)
                    .SetAddress("123 Main St")
                    .Build();
Console.WriteLine($"Name: {person._name}, Age: {person._age}, Address: {person._address}");
// 輸出: Name: John, Age: 30, Address: 123 Main St

-------------------------------------------------------------------
//使用引數物件
public class PersonParameters
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
}
public class Person
{
    private string _name;
    private int _age;
    private string _address;
    private Person() { }
    public class Builder
    {
        private PersonParameters _parameters = new PersonParameters();
        public Builder SetName(string name)
        {
            _parameters.Name = name;
            return this;
        }
        public Builder SetAge(int age)
        {
            _parameters.Age = age;
            return this;
        }
        public Builder SetAddress(string address)
        {
            _parameters.Address = address;
            return this;
        }
        public Person Build()
        {
            //構造物件初始化
            Person _person=new Person
            {
                Name=_parameters.Name,
                Age=_parameters.Age,
                Name=_parameters.Name,
            }
            return _person;
        }
    }
}
  1. 後面我就想到了Serilog;那個初始化好像就是鏈式的;構建器模式耶;(主機構建哪裡都是,抱歉了)
Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .WriteTo.Console()
            .WriteTo.File("logs/log.txt", rollingInterval: RollingInterval.Day)
            .CreateLogger();
  1. 接著我繼續問:.MinimumLevel.Debug() 這裡的MinimumLevel是一個類;而Debug()是一個靜態方法麼;
    我是想的MinimumLevel靜態類,Debug()是一個靜態方法;
    好吧我的想法是錯的;是中間加了一個類來設定一些資訊;或者中間類的擴充套件方法來的
public class LoggerConfiguration
{
    public LoggerMinimumLevelConfiguration MinimumLevel { get; }
    public LoggerSinkConfiguration WriteTo { get; }
    // 其他配置方法和屬性...
    public LoggerConfiguration()
    {
        MinimumLevel = new LoggerMinimumLevelConfiguration(this);
        WriteTo = new LoggerSinkConfiguration(this);
    }
}
public class LoggerMinimumLevelConfiguration
{
    private readonly LoggerConfiguration _loggerConfiguration;

    public LoggerMinimumLevelConfiguration(LoggerConfiguration loggerConfiguration)
    {
        _loggerConfiguration = loggerConfiguration;
    }
    public LoggerConfiguration Debug()
    {
        _loggerConfiguration.MinimumLevelControlledBy(new LoggingLevelSwitch(LogEventLevel.Debug));
        return _loggerConfiguration;
    }
    // 其他級別設定方法...
}

----------
//,WriteTo.Console() 
//使用擴充套件方法
public static class LoggerSinkConfigurationExtensions
{
    public static LoggerConfiguration Console(this LoggerSinkConfiguration sinkConfiguration)
    {
        //列印
        return sinkConfiguration.Sink(new ConsoleSink());
    }
    // 其他擴充套件方法...
}
//使用中間類
public class LoggerSinkConfiguration
{
    private readonly LoggerConfiguration _loggerConfiguration;
    public LoggerSinkConfiguration(LoggerConfiguration loggerConfiguration)
    {
        _loggerConfiguration = loggerConfiguration;
    }
    public LoggerConfiguration Console()
    {
        // 配置控制檯輸出
        return _loggerConfiguration;
    }
    public LoggerConfiguration File(string path, RollingInterval rollingInterval)
    {
        // 配置檔案輸出及滾動策略
        return _loggerConfiguration;
    }
    // 其他輸出目標配置方法...
}

  1. 然後我又看了一下,回顧了我收藏的資源,果然我適合當鹹魚。

總結:

主要了為了記憶深刻一些;感覺有了那些大模型後更加懶了,不僅不主動去了解一些知識,也覺得以前寫都沒多大意義;留著留個念想;
覺得反正ai一下麼,不手到擒來(想法是錯的,使人懶惰,技術很難精進的);但是如果當個小嘍嘍,實話說無所謂了,我們很自信,我們也要掂量掂量自己的分量。

當然我也希望可以直接大躍進到,腦機介面民用,直接動腦子搜尋(在思維上),直接讀取相關資料就好了,也不能都記住,畢竟記憶體還是有限的,腦容量是硬碟,記憶是記憶體。

相關文章