主頁 > .NET開發 > 建造者模式(Builder)——從組裝電腦開始

建造者模式(Builder)——從組裝電腦開始

2020-09-19 18:47:47 .NET開發

建造者模式(Builder)——從組裝電腦開始

建造者模式概括起來就是將不同獨立的組件按照一定的條件組合起來構成一個相對業務完整的物件,呼叫者無需知道構造的程序,

我們從組裝電腦開始

讓我們從買組裝電腦開始吧,

首先要買一個電腦,一般都有兩個選擇 —— 品牌電腦和組裝電腦,一般人為了省事和放心都會選擇買品牌電腦(也就是整機),在這里,為了更好的分析問題,假定我們為了性價比決定要買組裝電腦,那么我們該怎么做呢,

首先我們得學習一個完整的電腦的組成部分有哪些?

經過翻查一部分資料發現,主要部件分為主板、CPU、顯卡、顯示屏、記憶體條等,這還剛開始,我們光知道這個還不行,每個硬體的品牌少說都有好幾種,我們肯定希望在價格允許的情況選最好的,所以我們還得花時間找資料了解每個部件對應的品牌的口碑與使用者的實際體驗情況(比如淘寶的賣家秀,以及網上一些專業的測評人的報告等),

好了,研究完這個之后呢,總算是可以決定怎么搭配各種硬體了,但是最后又有一個問題來了,這些硬體買回來了,我們這些小白不會裝啊,都不知道主機箱里每個部件對應的位置是哪里,以及怎么裝上去,萬一裝壞了怎么辦,那錢豈不是白花了,

又是一番曲折之后,總算是把整個電腦組裝完畢了,就在我們舉杯同慶的時候,突然發現了一個嚴重的問題……

“天吶,還開不了機啊,還要給電腦裝系統啊”

“啊!!!那怎么辦啊,都忙活一整天了,”

“還能怎么辦啊?買都買了,裝都裝好了,只能裝系統呀”

“也是,可我不會裝系統啊,你會么?”

“……嗯~我也不會”

“哎,咱們還是去查資料怎么裝系統吧”

上面的故事雖然在我們ITer來看,顯得很搞笑和夸張,但是對于電腦小白來說,這可是絕對會發生的,因為在大學,我就是這么過來的,光怎么重裝系統都花了我一天時間,

但是,別急,我們隔壁寢室的一個同學他早上說他也要買組裝電腦,我們現在去看他怎么弄的吧,說實話,我既希望他也跟我們一樣經過種種折磨,但是又希望他也能一帆風順,這樣就能教我們怎么裝系統了啊,

什么?已經開始玩電腦了

當我們進寢室門的時候,令我們目瞪口呆的事情發生了,我發現他已經開始玩英雄聯盟了,都已經三殺并成功結束游戲,

我馬上就問他怎么這么快就玩上電腦了,然后我就把我一整天的遭遇發泄了出來,只見他哈哈大笑

”現在誰還自己買各種部件來裝電腦啊,更何況像你們還不懂這些,“

”那不然怎么弄,品牌機同等價位的比組裝機要貴好多啊“

”哈哈,你這個蠢嘛批,你可以去電腦城讓老板幫你組裝不就行了,你只需要為此付一些手工費就行了嘛,也不貴啊“

”……“

開始對號入座

第一則故事其實就相當于我們沒有用建造者模式開發可能面臨的一些問題,為了生成一個業務物件(組裝電腦),我們得花很多時間精力來收集業務物件的成員資訊(組成部分),這么多物件全由我一個人(客戶端)組織,這樣就會強耦合,并很有可能因為一些細小需求的改變而導致整個功能例外(忘記裝系統,記憶體條型號不對等),從而浪費了更多的時間和精力,增加了我們的勞動成本和經濟成本,

第二則故事就完全不同,我(用戶/客戶端)完全不需關心業務物件的構建程序,只需要找電腦城老板(構建者)要物件就行了,

首先有一個前提,就是有一個規則依據(契約)來構造一個正確的業務物件(電腦),

所以為了以正確姿勢來組裝電腦,我們定義了一些必要的成員(硬體)

public interface IFullComputer {
    string Mainboard { get; }
    string CPU { get; }
    string Disk { get; }
    string Graphics { get; }
    string Display { get; }
    bool HasOperatingSystem { get; }
}

有了它才代表一個完整正確的電腦,我們先來看我們第二個故事是怎么實作結果呼叫的吧,

public class Client {
    // 交給電腦城老板
    private void IWantBuyComputer() {
        // 見到老板
        var boss = new ComputerCityBoss();
        // 告訴老板我想要什么配置的電腦,這里簡單起就用老板推薦的
        var computerBuilder = new DefaultFullComputerBuilder();
        var computer = boss.TellMeThenReturnComputer(computerBuilder);
        Console.WriteLine("電腦組件完畢,是否預裝系統:" + computer.HasOperatingSystem);
    }

}

客戶端(用戶)已經很簡單了,就跟我們現在很多人買電腦一樣,去電腦城把自己搭配的電腦配置給老板,然后就等著老板把組裝好的電腦交給你,你根本不需要知道電腦組裝的細節,這樣從代碼上就能做客戶端與業務資料分離,

現在我們來看具體實作代碼,

public interface IFullComputerBuilder : IFullComputer {
    IFullComputer Create();
}
public class DefaultFullComputerBuilder : AbstractFullComputerBuilder {
    protected override void SetCPU() {
    }

    protected override void SetDisk() {
    }

    protected override void SetDisplay() {
    }

    protected override void SetGraphics() {
    }

    protected override void SetMainboard() {
    }
}
// 老板與品牌商有合作
public abstract class AbstractFullComputerBuilder : IFullComputerBuilder {
    public string Mainboard { get; set; } = "默認品牌主板";
    public string CPU { get; set; } = "默認品牌CPU";
    public string Disk { get; set; } = "默認品牌記憶體";
    public string Graphics { get; set; } = "默認品牌顯卡";
    public string Display { get; set; } = "默認品牌顯示幕";
    public bool HasOperatingSystem { get; set; }

    public IFullComputer Create() {
        SetMainboard();
        SetCPU();
        SetDisk();
        SetDisplay();
        SetGraphics();
        InstallOperatingSystem();
        if (!HasOperatingSystem) throw new InvalidOperationException("install faild: no operating system");
        return this;
    }

    protected abstract void SetMainboard();
    protected abstract void SetCPU();
    protected abstract void SetDisk();
    protected abstract void SetGraphics();
    protected abstract void SetDisplay();

    private void InstallOperatingSystem() {
        //if (!condition) return;
        HasOperatingSystem = true;
    }
}

老板就會根據你的要求來給你組裝電腦,當然,如果你沒有特殊要求,那老板就會默認用品牌合作商的,利潤更多嘛,

public class ComputerCityBoss {
    public IFullComputer TellMeThenReturnComputer(IFullComputerBuilder builder) {
        return builder.Create();
    }
}

再來看.NETCore原始碼加深學習

我們在可以通過一些優秀的框架的原始碼來學習加深我們對知識點的理解,

在 .netcore 中,Builder 模式是很常見的,相信很多人都知道 .netcore 啟動程式就是用 Builder 模式:

public class Program {
    public static void Main(string[] args) {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder => {
            webBuilder.UseStartup<Startup>();
        });
}

其中 IHostBuilder 就是一個構造者,我們來看默認實作者 HostBuilder 的源代碼:

public IHost Build()
{
    if (_hostBuilt)
    {
        throw new InvalidOperationException("Build can only be called once.");
    }
    _hostBuilt = true;

    BuildHostConfiguration();
    CreateHostingEnvironment();
    CreateHostBuilderContext();
    BuildAppConfiguration();
    CreateServiceProvider();

    return _appServices.GetRequiredService<IHost>();
}

很明顯,它所做的就跟我們之前講的例子 —— AbstractFullComputerBuilder 做的是一樣的,都了為了構成一個完整的物件,內部組織了很多的模塊,而外部客戶端(Program)根本不需要知道其內部的具體細節,只負責呼叫 Builder 即可,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/82996.html

標籤:C#

上一篇:Reflection(反射)

下一篇:C# 呼叫APlayer教程

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more