C#設計模式之建造者模式生成器模式示例詳解

前言

建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個復雜的對象。這種類型的設計模式屬於創建型模式,它提供瞭一種創建對象的最佳方式。

建造者模式結構

主要由四個核心角色組建而成分別為

  • 生成器(Builder):抽象產品生產步驟的方法。
  • 具體生成器(Concrete Builders):產品生產步驟方法的不同的具體實現。
  • 產品(Products):最終生成的對象。
  • 主管:(Director) 類定義調用構造步驟的順序, 這樣你就可以創建和復用特定的產品配置。

結構類圖

實例

使用建造者模式的時候,我們應該先問問為什麼要使用它?使用它能給我們帶來什麼?當你考慮足夠瞭,使用起來才會更加順暢。下面會講解一些實例來代入我是如何理解的,也希望能幫助大傢更好的理解建造者模式!

電腦在我們日常生活中是非常常見的,它的核心組成是什麼呢?CPU、主板、電源、內存、硬盤等等,那麼客戶端需要我們構造出來一臺電腦,我們應該如何實現呢?

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}");
    }
}

大傢都知道電腦有固態硬盤和機械硬盤之分,當然需求也各異,畢竟現在顯卡偏貴,有大多數人選擇機械硬盤,有些愛玩遊戲的就需要固態硬盤,針對需求我們在構建電腦過程也會產生差異。

對於用戶來說他隻需要知道他要的東西(如帶固態硬盤電腦或者機械硬盤電腦),至於你的構建過程用戶也不會太在乎。

在上述例子中客戶需要手動去Set,如果需要Set的值過多,可能會導致用戶一些關鍵屬性少賦值,並且順序也是由用戶控制的,在某些環節出現問題,就會導致電腦組裝不起來。

針對上述問題,我們可以很容易的代入建造者模式,它能將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示!

使用建造者模式

通過上面一些表述,在構建產品過程中是穩定的,而具體的構造細節是不一樣的有的需要固態硬盤,有的要機械硬盤等,那我們如何使用建造者模式呢?

// 建造者核心角色生成器
public interface IComputerBuilder
{
    void SetCpu(string cup);
    void SetMainboard(string mainboard);
    void SetPowerSupply(string powerSupply);
    void SetIsGraphicsCard(string graphicsCard);
}
// A電腦具體生成器(固態硬盤電腦)
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 = "固態硬盤";
    public void SetMainboard() => Computer.Mainboard = "主板";
    public void SetPowerSupply() => Computer.PowerSupply = "電源";
}
// A電腦具體生成器(機械硬盤電腦)
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 = "機械硬盤";
    public void SetMainboard() => Computer.Mainboard = "主板";
    public void SetPowerSupply() => Computer.PowerSupply = "電源";
}
  • 通過瞭解建造者模式結構,我們需要引入主管(Director)概念類定義調用構造步驟的順序。
public class Director 
{
    private IComputerBuilder ComputerBuilder;
    //客戶端代碼會創建生成器對象並將其傳遞給主管,然後執行構造過程。
    public Director(IComputerBuilder _ComputerBuilder) 
    {
        ComputerBuilder = _ComputerBuilder;
    }
    public Computer Build() 
    {
        ComputerBuilder.SetCpu();
        ComputerBuilder.SetMainboard();
        ComputerBuilder.SetPowerSupply();
        ComputerBuilder.SetHardDisk();
        return ComputerBuilder.GetComputer();
    }
}
  • 執行結果

總結

使用建造者模式,可以將項目中復雜的構建邏輯提取出來,並且可以分佈構建。電腦這個產品的組成是一些固定的硬件,變得隻是這些具體的硬件,比如需要構建500W電源的電腦亦或者是750W的電腦,隻需要繼承IComputerBuilder實現即可(可擴展性)。

但是如果內部復雜,可能會產生非常多的建造者類,無疑會產生非常多的類,代碼復雜度提高瞭。註意: 當具體建造者隻有一個的時候,主管(Director)完全可以省略掉。

以上就是C#設計模式之建造者模式生成器模式示例詳解的詳細內容,更多關於C#設計模式建造者模式的資料請關註WalkonNet其它相關文章!

推薦閱讀: