.NET-9-電腦思想-構建器模式(Builder Pattern)

来源:https://www.cnblogs.com/zhouyitty/p/18259772
-Advertisement-
Play Games

目錄前言學習參考過程總結: 前言 做個自由仔。 學習參考 ChatGpt; https://www.cnblogs.com/zhili/p/DesignPatternSummery.html(大佬的,看了好多次) 過程 原由: 一開始只是想查查鏈式調用原理,以為是要繼承什麼介面,實現什麼方法才可以實 ...


目錄

前言

做個自由仔。

學習參考

  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一下麽,不手到擒來(想法是錯的,使人懶惰,技術很難精進的);但是如果當個小嘍嘍,實話說無所謂了,我們很自信,我們也要掂量掂量自己的分量。

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天我們還講講Consumer、Supplier、Predicate、Function這幾個介面的用法,在 Java8 的用法當中,這幾個介面雖然沒有明目張膽的使用,但是,卻是潤物細無聲的。為什麼這麼說呢?這幾個介面都在 java.util.function 包下的,分別是Consumer(消費型) ...
  • pip install --upgrade langchain==0.0.279 -i https://pypi.org/simple 1 創建一個LLM 自有算力平臺+開源大模型(需要有龐大的GPU資源)企業自己訓練數據 第三方大模型API(openai/百度文心/阿裡通義千問...)數據無所謂 ...
  • LLM大模型與AI應用的粘合劑。 1 langchain是什麼以及發展過程 LangChain是一個開源框架,旨在簡化使用大型語言模型構建端到端應用程式的過程,也是ReAct(reason+act)論文的落地實現。 2022年10月25日開源 54K+ star 種子輪一周1000萬美金,A輪250 ...
  • 1.創建一個文件夾HCJV_01 2.vscode打開該文件夾,打開終端。 3.使用vite安裝,選擇vue,選擇JavaScript,項目名稱demo01 cnpm create vite@latest 4.跳轉demo01目錄下 cd demo01 5.安裝cnpm cnpm install 嘗 ...
  • 下麵將完成的展示,使用MAPI介面操作Outlook完成通訊錄更新。 using Microsoft.Office.Interop.Outlook; using Microsoft.VisualBasic; using System; using System.Collections; using ...
  • 前言 之前已經分享過幾篇關於中台項目框架的文章,相關介紹就不再贅述 所謂工欲善其事必先利其器,一個項目擁有一個代碼生成器是很有必要的,能夠大大的節省時間,減少手誤,提供開發效率(ps:特別小團隊搞微服務但是沒有代碼生成器,簡直要了老命) 本文將分享如何在中台框架項目 Admin.Core 中添加代碼 ...
  • 官網:Git for Windows 點擊下載安裝。 右擊滑鼠會出現GUI和Bash 選擇git bash here 配置全局用戶名和郵箱(gitee) git config --global user.name "你的名字" git config --global user.email 你的郵箱 ...
  • C# 13 即 .Net 9 按照計劃會在2024年11月發佈,目前一些新特性已經定型,今天讓我們來預覽一個比較大型比較重要的新特性: 擴展類型 extension types ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...