C#設(shè)計模式之建造者模式生成器模式示例詳解
前言
建造者模式(Builder Pattern)使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
建造者模式結(jié)構(gòu)
主要由四個核心角色組建而成分別為
- 生成器(Builder):抽象產(chǎn)品生產(chǎn)步驟的方法。
- 具體生成器(Concrete Builders):產(chǎn)品生產(chǎn)步驟方法的不同的具體實(shí)現(xiàn)。
- 產(chǎn)品(Products):最終生成的對象。
- 主管:(Director) 類定義調(diào)用構(gòu)造步驟的順序, 這樣你就可以創(chuàng)建和復(fù)用特定的產(chǎn)品配置。

結(jié)構(gòu)類圖
實(shí)例
使用建造者模式的時候,我們應(yīng)該先問問為什么要使用它?使用它能給我們帶來什么?當(dāng)你考慮足夠了,使用起來才會更加順暢。下面會講解一些實(shí)例來代入我是如何理解的,也希望能幫助大家更好的理解建造者模式!
電腦在我們?nèi)粘I钪惺欠浅3R姷?,它的核心組成是什么呢?CPU、主板、電源、內(nèi)存、硬盤等等,那么客戶端需要我們構(gòu)造出來一臺電腦,我們應(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)硬盤,針對需求我們在構(gòu)建電腦過程也會產(chǎn)生差異。
對于用戶來說他只需要知道他要的東西(如帶固態(tài)硬盤電腦或者機(jī)械硬盤電腦),至于你的構(gòu)建過程用戶也不會太在乎。
在上述例子中客戶需要手動去Set,如果需要Set的值過多,可能會導(dǎo)致用戶一些關(guān)鍵屬性少賦值,并且順序也是由用戶控制的,在某些環(huán)節(jié)出現(xiàn)問題,就會導(dǎo)致電腦組裝不起來。
針對上述問題,我們可以很容易的代入建造者模式,它能將一個復(fù)雜對象的構(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;
//客戶端代碼會創(chuàng)建生成器對象并將其傳遞給主管,然后執(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é)
使用建造者模式,可以將項目中復(fù)雜的構(gòu)建邏輯提取出來,并且可以分布構(gòu)建。電腦這個產(chǎn)品的組成是一些固定的硬件,變得只是這些具體的硬件,比如需要構(gòu)建500W電源的電腦亦或者是750W的電腦,只需要繼承IComputerBuilder實(shí)現(xiàn)即可(可擴(kuò)展性)。
但是如果內(nèi)部復(fù)雜,可能會產(chǎn)生非常多的建造者類,無疑會產(chǎn)生非常多的類,代碼復(fù)雜度提高了。注意: 當(dāng)具體建造者只有一個的時候,主管(Director)完全可以省略掉。
以上就是C#設(shè)計模式之建造者模式生成器模式示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C#設(shè)計模式建造者模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息
這篇文章主要介紹了詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
DevExpress的DateEdit設(shè)置顯示日期和時間的方法
本文主要介紹了DevExpress的DateEdit設(shè)置顯示日期和時間的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
C#實(shí)現(xiàn)鼠標(biāo)左右鍵切換效果
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)鼠標(biāo)左右鍵切換功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
C#實(shí)現(xiàn)給Word每一頁設(shè)置不同圖片水印
Word中設(shè)置水印時,可加載圖片設(shè)置為水印效果,但通常添加水印效果時,會對所有頁面都設(shè)置成統(tǒng)一效果。本文將利用C#實(shí)現(xiàn)給Word每一頁設(shè)置不同圖片水印的效果,需要的可以參考一下2022-02-02
C#實(shí)現(xiàn)連接SQL Server2012數(shù)據(jù)庫并執(zhí)行SQL語句的方法
這篇文章主要介紹了C#實(shí)現(xiàn)連接SQL Server2012數(shù)據(jù)庫并執(zhí)行SQL語句的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了C#連接SQL Server2012數(shù)據(jù)庫并執(zhí)行查詢、插入等操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10

