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

注:該類圖來源網上
需求
用組裝電腦來說明,如果公司要采購一批電腦,此時采購員不可能自己去買各個組件并把它們組織起來,此時采購員只需要像電腦城的老板說自己要采購什么樣的電腦就可以了,電腦城老板自然會把組裝好的電腦送到公司,
未使用建造者模式的代碼
/// <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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/544538.html
標籤:.NET技术
