原來建造者模式是這樣用的

来源:https://www.cnblogs.com/mhg215/archive/2023/02/21/17138377.html
-Advertisement-
Play Games

概述 面臨一個複雜對象的創建工作,通常由各個部分的子對象用一定的演算法構成。子部件(對象)比較多,對象不能當作一個完整的對象或者產品使用(郵件:發件人,收件人、抄送人、主題、郵件內容)子部件需要按照一定的順序賦值才有一定的意義,在某個子部件沒有賦值之前,另一個子部件就無法賦值。 類圖 註:該類圖來源網 ...


概述

面臨一個複雜對象的創建工作,通常由各個部分的子對象用一定的演算法構成。
子部件(對象)比較多,對象不能當作一個完整的對象或者產品使用(郵件:發件人,收件人、抄送人、主題、郵件內容)
子部件需要按照一定的順序賦值才有一定的意義,在某個子部件沒有賦值之前,另一個子部件就無法賦值。

類圖

註:該類圖來源網上

需求

用組裝電腦來說明,如果公司要採購一批電腦,此時採購員不可能自己去買各個組件並把它們組織起來,此時採購員只需要像電腦城的老闆說自己要採購什麼樣的電腦就可以了,電腦城老闆自然會把組裝好的電腦送到公司。

未使用建造者模式的代碼

  /// <summary>
    /// 產品類
    /// </summary>
    public class Computer
    {
        private List<string> _servers = new List<string>();
        public void AddPart(string part)
        { 
        _servers.Add(part);
        }
        public void ShowComputer()
        {
            foreach (var item in _servers)
            {
                Console.WriteLine($"正在安裝{item}");
            }
        }
    }
//C#控制台調用
Computer computer = new Computer();
computer.AddPart("i5的cpu");
computer.AddPart("256G的硬碟");
computer.AddPart("32G的記憶體");
computer.AddPart("17寸的顯示器");
computer.AddPart("win7的操作系統");
computer.ShowComputer();

以上就是組裝電腦的代碼,如果是個人組裝一臺,那這麼玩某種程度上是可以的;對於公司而言,要採購一批電腦,這麼玩效率就太低下了,採購員不可能挨個買零件回來自己組裝。反正總的來說,浪費時間和精力,所有內容全部需要客戶搞定,而且創建對象和客戶端強耦合。

使用建造者模式的代碼

 public interface IBuilderComputer
    {
        //1 封裝創建各個部件的過程

        void BuildCpu();
        void BuildDisk();
        void BuildMemory();
        void BuildScreen();
        void BuildSystem();
        //2、將創建好的複雜對象返回
        Computer GetComputer();

    }
 public class MyDirectory
    {
        public void BuildComputer(IBuilderComputer builderComputer)
        {
            builderComputer.BuildCpu();
            builderComputer.BuildDisk();
            builderComputer.BuildMemory();
            builderComputer.BuildScreen();
            builderComputer.BuildSystem();
        }
    }
 /// <summary>
    /// 具體建造者一
    /// </summary>
    public class GoodComputer : IBuilderComputer
    {
        private Computer _computer=new Computer();
        public void BuildCpu()
        {
            _computer.AddPart("i7的cpu");
        }

        public void BuildDisk()
        {
            _computer.AddPart("2T的固態硬碟");
        }

        public void BuildMemory()
        {
            _computer.AddPart("32G的記憶體");
        }

        public void BuildScreen()
        {
            _computer.AddPart("32寸的顯示屏的記憶體");
        }

        public void BuildSystem()
        {
            _computer.AddPart("win10的操作系統");
        }

        public Computer GetComputer()
        {
           return _computer;    
        }
    }
    /// <summary>
    /// 具體建造者二
    /// </summary>
    public class BadComputer : IBuilderComputer
    {
        private Computer _computer = new Computer();
        public void BuildCpu()
        {
            _computer.AddPart("i3的cpu");
        }

        public void BuildDisk()
        {
            _computer.AddPart("126的機械硬碟");
        }

        public void BuildMemory()
        {
            _computer.AddPart("2G的記憶體");
        }

        public void BuildScreen()
        {
            _computer.AddPart("14寸的顯示屏的記憶體");
        }

        public void BuildSystem()
        {
            _computer.AddPart("win7的操作系統");
        }

        public Computer GetComputer()
        {
            return _computer;
        }
    }
    /// <summary>
    /// 產品類
    /// </summary>
    public class Computer
    {
        private List<string> _servers = new List<string>();
        public void AddPart(string part)
        { 
        _servers.Add(part);
        }
        public void ShowComputer()
        {
            foreach (var item in _servers)
            {
                Console.WriteLine($"正在安裝{item}");
            }
        }
    }
//C#控制台調用
Console.WriteLine("建造者設計模式正式登場");
IBuilderComputer b1=new GoodComputer();
IBuilderComputer b2 = new BadComputer();
MyDirectory directory = new MyDirectory();
directory.BuildComputer(b1);
 var goodComputer= b1.GetComputer();
goodComputer.ShowComputer(); 

directory.BuildComputer(b2);    
var badComputer=  b2.GetComputer();
badComputer.ShowComputer(); 

以上是使用建造者模式實現採購電腦的代碼,現在僅僅是採購了2台,如果採購10台,那就很簡單了。

建造者模式比較簡單,其實像上面的類圖已經說得很明確,abstractBuilder(抽象建造者)、ConcreteBuilder(具體建造者)、product(具體產品)、 Director(指揮者),只要掌握好這4個之間的關係,實現起來照貓畫虎。

有人問建造者模式與工廠模式有什麼區別?

1、建造者模式更加註重方法的調用順序,工廠模式註重創建對象。

2、創建對象的力度不同,建造者創建複雜的對象,由各路複雜的部件組成,工廠模式創建出的對象都一樣。

3、關註點不同,工廠模式只需要把對象創建出來就可以,而建造者不僅要創建出這個對象,還要知道這個對象由哪些部件組成。

4、建造者模式根據建造過程中的順序不一樣,最終的對象部件組成也不一樣

總結

不知道大家用得建造者模式多不多,有人說他還沒用過,其實像我們的.NetCore裡面就有大量的建造者模式的使用,可以在梳理dotnetcore源碼時多留意體會一下。有何疑問,歡迎交流。

作者:realyrare

出處:https://www.cnblogs.com/mhg215/

聲援博主:如果您覺得文章對您有幫助,請點擊文章末尾的【關註我】吧!

別忘記點擊文章右下角的【推薦】支持一波。~~~///(^v^)\\\~~~ .

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

如果您有其他問題,也歡迎關註我下方的公眾號,可以聯繫我一起交流切磋!

碼雲:碼雲      github:github


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

-Advertisement-
Play Games
更多相關文章
  • cron 有2種表達形式 6個時間刻度的話 * * * * * * 分別對應 秒 分 時 日 月 星期 ; 7個時間刻度的話 * * * * * * * 分別對應 秒 分 時 日 月 星期 年; >>>註意 時間刻度之間得用 ‘空格’分隔 對應的通配符有: * ? / - , 星號(*): 指的是 ...
  • 阿裡雲物聯網平臺專用工具基本涵蓋了阿裡雲物聯網平臺提供你主要管理功能,可以方便創建產品、設備、物模型,查看設備實時屬性,事件,發送服務和查看服務日誌等等 ...
  • 近期,業務調整,需要內網讀取數據後存入到外網,同時,其他伺服器也需要讀取數據,於是我又盯上了RabbitMQ。在展開業務代碼前,先看下RabbitMQ整體架構,可以看到Exchange和隊列是多對多關係。 下麵,我們詳細說說RabbitMQ的隊列模式:簡單隊列、工作隊列、發佈訂閱模式、路由模式、主題 ...
  • Net 內置記憶體緩存 asp.net 中是有緩存的實現:HttpContext.Cache,緩存的數據是放到 Web 伺服器的進程 記憶體里。 在控制台、WinForm、子線程、SignalR 等不支持 HttpContext 的地方還可以使用 MemoryCache.Default(System.R ...
  • FTP作為日常工作學習中,非常重要的一個文件傳輸存儲空間,想必大家都非常的熟悉了,那麼如何快速的實現文件的上傳下載功能呢,本文以一個簡單的小例子,簡述如何通過FluentFTP實現文件的上傳和下載功能。僅供學習分享使用,如有不足之處,還請指正。 ...
  • 大家好,我是沙漠盡頭的狼。 本文先拋出以下問題,請在文中尋找答案,可在評論區回答: 什麼是API攔截? 一個方法被很多地方調用,怎麼在不修改這個方法源碼情況下,記錄這個方法調用的前後時間? 同2,不修改源碼的情況下,怎麼對方法的參數進行校正(篡改)? 同3,不修改源碼的情況下,怎麼對方法的返回值進行 ...
  • 一:背景 1. 講故事 一直在追這個系列的朋友應該能感受到,我給這個行業中無數的陌生人分析過各種dump,終於在上周有位老同學找到我,還是個大妹子,必須有求必應 😁😁😁。 妹子公司的系統最近在某次升級之後,在高峰期會遇到 CPU 爆高的現象,有些單位你懂的,很強勢,所以就苦逼了程式媛,不管怎麼 ...
  • 1. Ioc 與 DI Ioc 和DI 這兩個詞大家都應該比較熟悉,這兩者已經在各種開發語言各種框架中普遍使用,成為框架中的一種基本設施了。 Ioc 是控制反轉, Inversion of Control 的縮寫,DI 是依賴註入,Inject Dependency 的縮寫。 所謂控制反轉,反轉的是 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...