概述 面臨一個複雜對象的創建工作,通常由各個部分的子對象用一定的演算法構成。子部件(對象)比較多,對象不能當作一個完整的對象或者產品使用(郵件:發件人,收件人、抄送人、主題、郵件內容)子部件需要按照一定的順序賦值才有一定的意義,在某個子部件沒有賦值之前,另一個子部件就無法賦值。 類圖 註:該類圖來源網 ...
概述
面臨一個複雜對象的創建工作,通常由各個部分的子對象用一定的演算法構成。
子部件(對象)比較多,對象不能當作一個完整的對象或者產品使用(郵件:發件人,收件人、抄送人、主題、郵件內容)
子部件需要按照一定的順序賦值才有一定的意義,在某個子部件沒有賦值之前,另一個子部件就無法賦值。
類圖
註:該類圖來源網上
需求
用組裝電腦來說明,如果公司要採購一批電腦,此時採購員不可能自己去買各個組件並把它們組織起來,此時採購員只需要像電腦城的老闆說自己要採購什麼樣的電腦就可以了,電腦城老闆自然會把組裝好的電腦送到公司。
未使用建造者模式的代碼
/// <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^)\\\~~~ .
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
如果您有其他問題,也歡迎關註我下方的公眾號,可以聯繫我一起交流切磋!