C#設(shè)計(jì)模式之建造者模式生成器模式示例詳解
前言
建造者模式(Builder Pattern)使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建成一個(gè)復(fù)雜的對(duì)象。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
建造者模式結(jié)構(gòu)
主要由四個(gè)核心角色組建而成分別為
- 生成器(Builder):抽象產(chǎn)品生產(chǎn)步驟的方法。
- 具體生成器(Concrete Builders):產(chǎn)品生產(chǎn)步驟方法的不同的具體實(shí)現(xiàn)。
- 產(chǎn)品(Products):最終生成的對(duì)象。
- 主管:(Director) 類定義調(diào)用構(gòu)造步驟的順序, 這樣你就可以創(chuàng)建和復(fù)用特定的產(chǎn)品配置。
結(jié)構(gòu)類圖
實(shí)例
使用建造者模式的時(shí)候,我們應(yīng)該先問問為什么要使用它?使用它能給我們帶來什么?當(dāng)你考慮足夠了,使用起來才會(huì)更加順暢。下面會(huì)講解一些實(shí)例來代入我是如何理解的,也希望能幫助大家更好的理解建造者模式!
電腦在我們?nèi)粘I钪惺欠浅3R姷模暮诵慕M成是什么呢?CPU、主板、電源、內(nèi)存、硬盤等等,那么客戶端需要我們構(gòu)造出來一臺(tái)電腦,我們應(yīng)該如何實(shí)現(xiàn)呢?
static void Main(string[] args) { Computer computer = new Computer(); computer.SetCpu("cpu"); computer.SetMainboard("主板"); computer.SetPowerSupply("電源"); computer.SetGraphicsCard("集成顯卡"); computer.GetComputerInfo(); Console.ReadLine(); } public class Computer { private string _cpu; private string _mainboard; private string _powerSupply; private string _graphicsCard; public void SetCpu(string cup) { _cpu = cup; } public void SetMainboard(string mainboard) { _mainboard = mainboard; } public void SetPowerSupply(string powerSupply) { _powerSupply = powerSupply; } public void SetGraphicsCard(string graphicsCard) { _graphicsCard = graphicsCard; } public void GetComputerInfo() { Console.WriteLine($"電腦配置為Cpu:{_cpu},主板為:{_mainboard},電源為:{_powerSupply},顯卡為:{_graphicsCard}"); } }
大家都知道電腦有固態(tài)硬盤和機(jī)械硬盤之分,當(dāng)然需求也各異,畢竟現(xiàn)在顯卡偏貴,有大多數(shù)人選擇機(jī)械硬盤,有些愛玩游戲的就需要固態(tài)硬盤,針對(duì)需求我們?cè)跇?gòu)建電腦過程也會(huì)產(chǎn)生差異。
對(duì)于用戶來說他只需要知道他要的東西(如帶固態(tài)硬盤電腦或者機(jī)械硬盤電腦),至于你的構(gòu)建過程用戶也不會(huì)太在乎。
在上述例子中客戶需要手動(dòng)去Set,如果需要Set的值過多,可能會(huì)導(dǎo)致用戶一些關(guān)鍵屬性少賦值,并且順序也是由用戶控制的,在某些環(huán)節(jié)出現(xiàn)問題,就會(huì)導(dǎo)致電腦組裝不起來。
針對(duì)上述問題,我們可以很容易的代入建造者模式,它能將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示!
使用建造者模式
通過上面一些表述,在構(gòu)建產(chǎn)品過程中是穩(wěn)定的,而具體的構(gòu)造細(xì)節(jié)是不一樣的有的需要固態(tài)硬盤,有的要機(jī)械硬盤等,那我們?nèi)绾问褂媒ㄔ煺吣J侥兀?/p>
// 建造者核心角色生成器 public interface IComputerBuilder { void SetCpu(string cup); void SetMainboard(string mainboard); void SetPowerSupply(string powerSupply); void SetIsGraphicsCard(string graphicsCard); } // A電腦具體生成器(固態(tài)硬盤電腦) public class AComputerBuilder : IComputerBuilder { private Computer Computer; public AComputerBuilder() { Computer = new Computer(); } public Computer GetComputer() { return Computer; } public void SetCpu() => Computer.Cpu = "CPU"; public void SetHardDisk() => Computer.HardDisk = "固態(tài)硬盤"; public void SetMainboard() => Computer.Mainboard = "主板"; public void SetPowerSupply() => Computer.PowerSupply = "電源"; } // A電腦具體生成器(機(jī)械硬盤電腦) public class BComputerBuilder : IComputerBuilder { private Computer Computer; public BComputerBuilder() { Computer = new Computer(); } public Computer GetComputer() { return Computer; } public void SetCpu() => Computer.Cpu = "CPU"; public void SetHardDisk() => Computer.HardDisk = "機(jī)械硬盤"; public void SetMainboard() => Computer.Mainboard = "主板"; public void SetPowerSupply() => Computer.PowerSupply = "電源"; }
- 通過了解建造者模式結(jié)構(gòu),我們需要引入主管(Director)概念類定義調(diào)用構(gòu)造步驟的順序。
public class Director { private IComputerBuilder ComputerBuilder; //客戶端代碼會(huì)創(chuàng)建生成器對(duì)象并將其傳遞給主管,然后執(zhí)行構(gòu)造過程。 public Director(IComputerBuilder _ComputerBuilder) { ComputerBuilder = _ComputerBuilder; } public Computer Build() { ComputerBuilder.SetCpu(); ComputerBuilder.SetMainboard(); ComputerBuilder.SetPowerSupply(); ComputerBuilder.SetHardDisk(); return ComputerBuilder.GetComputer(); } }
- 執(zhí)行結(jié)果
總結(jié)
使用建造者模式,可以將項(xiàng)目中復(fù)雜的構(gòu)建邏輯提取出來,并且可以分布構(gòu)建。電腦這個(gè)產(chǎn)品的組成是一些固定的硬件,變得只是這些具體的硬件,比如需要構(gòu)建500W電源的電腦亦或者是750W的電腦,只需要繼承IComputerBuilder實(shí)現(xiàn)即可(可擴(kuò)展性)。
但是如果內(nèi)部復(fù)雜,可能會(huì)產(chǎn)生非常多的建造者類,無(wú)疑會(huì)產(chǎn)生非常多的類,代碼復(fù)雜度提高了。注意: 當(dāng)具體建造者只有一個(gè)的時(shí)候,主管(Director)完全可以省略掉。
以上就是C#設(shè)計(jì)模式之建造者模式生成器模式示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C#設(shè)計(jì)模式建造者模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C#實(shí)現(xiàn)文字視頻生成器的示例代碼
- C#實(shí)現(xiàn)封面圖片生成器的示例代碼
- Python實(shí)現(xiàn)C#代碼生成器應(yīng)用服務(wù)于Unity示例解析
- C#設(shè)計(jì)模式實(shí)現(xiàn)之生成器模式和責(zé)任鏈模式
- C# Guid長(zhǎng)度雪花簡(jiǎn)單生成器的示例代碼
- c# 如何實(shí)現(xiàn)代碼生成器
- C#設(shè)計(jì)模式之Builder生成器模式解決帶老婆配置電腦問題實(shí)例
- 詳解C#設(shè)計(jì)模式編程中生成器模式的使用
- 詳解C#中有趣的 SourceGenerator生成器
相關(guān)文章
Windows 8 Metro用C#連接SQLite及創(chuàng)建數(shù)據(jù)庫(kù),數(shù)據(jù)表的增刪改查的實(shí)現(xiàn)
本篇文章小編為大家介紹,Windows 8 Metro用C#連接SQLite及創(chuàng)建數(shù)據(jù)庫(kù),數(shù)據(jù)表的增刪改查的實(shí)現(xiàn)。需要的朋友參考下2013-04-04c#循環(huán)中產(chǎn)生偽隨機(jī)數(shù)
在循環(huán)中產(chǎn)生多個(gè)隨機(jī)數(shù),容易出現(xiàn)連續(xù)相同的數(shù)據(jù),最終的多個(gè)隨機(jī)數(shù)并不隨機(jī),而是帶有某種規(guī)律性。2010-06-06C#實(shí)現(xiàn)發(fā)送簡(jiǎn)單HTTP請(qǐng)求的方法
這篇文章主要介紹了C#實(shí)現(xiàn)發(fā)送簡(jiǎn)單HTTP請(qǐng)求的方法,涉及C#操作http的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04理解C#中參數(shù)的值和引用以及傳遞結(jié)構(gòu)和類引用的區(qū)別
這篇文章主要介紹了理解C#中參數(shù)的值和引用以及傳遞結(jié)構(gòu)和類引用的區(qū)別,文中舉了兩段代碼例子來簡(jiǎn)單說明,需要的朋友可以參考下2016-01-01