首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 設計模式無廢話系列(六):Builder 建造者模式

     編輯:關於C#

意圖

將複雜構建與其表示分離,使相同構建過程可創建不同表示。

適用場景

電腦城裝機:銷售詢問配置→出裝機單→提貨備料→技術人員按固定流程組裝(鎖主板→裝 CPU→裝記憶體→接硬碟→裝顯卡)。每台電腦零件不同(高/低配),但組裝流程固定。將變化零件與穩定流程分離 → Builder 模式。

完整範例程式碼

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace BuilderExemple
{
    class Program
    {
        static void Main(string[] args)
        {
            ComputerFactory factory = new ComputerFactory();
            ComputerBuilder office = new OfficeComputerBuilder();
            factory.BuildComputer(office);
            office.Computer.ShowSystemInfo();
            ComputerBuilder game = new GameComputerBuilder();
            factory.BuildComputer(game);
            game.Computer.ShowSystemInfo();
        }
    }
    class ComputerFactory
    {
        public void BuildComputer(ComputerBuilder cb)
        {
            Console.WriteLine($"\n>>>>>>>>>>>>>>>>>>Start Building {cb.Name}");
            cb.SetupMainboard();
            cb.SetupCpu();
            cb.SetupMemory();
            cb.SetupHarddisk();
            cb.SetupVideocard();
            Console.WriteLine($">>>>>>>>>>>>>>>>>>Build {cb.Name} Completed\n");
        }
    }
    abstract class ComputerBuilder
    {
        protected string name;
        public string Name { get => name; set => name = value; }
        protected Computer computer;
        public Computer Computer { get => computer; set => computer = value; }
        public ComputerBuilder() => computer = new Computer();
        public abstract void SetupMainboard();
        public abstract void SetupCpu();
        public abstract void SetupMemory();
        public abstract void SetupHarddisk();
        public abstract void SetupVideocard();
    }
    class OfficeComputerBuilder : ComputerBuilder
    {
        public OfficeComputerBuilder() => name = "OfficeComputer";
        public override void SetupMainboard() => computer.Mainboard = "Abit升技LG-95C 主板(Intel 945GC/LGA 775/1066MHz)";
        public override void SetupCpu() => computer.Cpu = "Intel 賽揚D 336 (2.8GHz/LGA 775/256K/533MHz)";
        public override void SetupMemory() => computer.Memory = "Patriot博帝DDR2 667 512MB";
        public override void SetupHarddisk() => computer.Harddisk = "Hitachi日立SATAII 80G/7200轉/8M";
        public override void SetupVideocard() => computer.Videocard = "主板集成";
    }
    class GameComputerBuilder : ComputerBuilder
    {
        public GameComputerBuilder() => name = "GameComputer";
        public override void SetupMainboard() => computer.Mainboard = "GIGABYTE技嘉GA-965P-DS3 3.3 主板(INTEl P965)";
        public override void SetupCpu() => computer.Cpu = "Intel 酷睿E4400 (2.0GHz/LGA 775/2M/800MHz)盒裝";
        public override void SetupMemory() => computer.Memory = "G.SKILl 芝奇F2-6400CL5D-2GBNQ DDR2 800 1G*2";
        public override void SetupHarddisk() => computer.Harddisk = "Hitachi日立SATAII 250G/7200轉/8M";
        public override void SetupVideocard() => computer.Videocard = "七彩虹GT-GD3 UP烈焰戰神H10 (GeForce 8600GT/256M/DDR3)支援HDMI";
    }
    class Computer
    {
        public string Videocard { get; set; }
        public string Cpu { get; set; }
        public string Mainboard { get; set; }
        public string Memory { get; set; }
        public string Harddisk { get; set; }
        public void ShowSystemInfo()
        {
            Console.WriteLine("==================SystemInfo==================");
            Console.WriteLine($"CPU:{Cpu}");
            Console.WriteLine($"MainBoard:{Mainboard}");
            Console.WriteLine($"Memory:{Memory}");
            Console.WriteLine($"VideoCard:{Videocard}");
            Console.WriteLine($"HardDisk:{Harddisk}");
        }
    }
}

程式碼執行結果

Builder 模式執行結果

程式碼解析

  • ComputerFactory:Director(指導者),執行穩定構建流程,不知零件具體規格,只負責按序組裝。
  • ComputerBuilder:抽象建造者,規範產品組成介面(5 道工序)與回傳產品介面(此處省略抽象方法,產品皆為 Computer)。
  • OfficeComputerBuilder/GameComputerBuilder:具體建造者,實作各工序與回傳產品。
  • Computer:複雜產品,各工序服務於產品各部件。可抽象化使不同建造者產出完全不同產品。
  • 客戶端:選擇具體 Builder → 讓 Factory 構建 → 驗收配置。用戶明確需求(辦公/遊戲),對組裝細節零認知。
  • Builder vs Abstract Factory:前者強調「組裝」有序序列,後者強調「創建一系列產品」。Builder 適用組裝電腦,Abstract Factory 適用提供筆記本/桌機/掌機產品線。

何時採用

  • 代碼角度:希望分離構建規則與內部組成,或相同構建過程用於不同類型。
  • 應用角度:解耦創建過程與具體配件,或復用穩定複雜邏輯創建產品。

實作要點

  • 構建過程由 Director 完成,具體組成由具體 Builder 完成,表示與構建分離。
  • Builder 與 Director 為關鍵,合併/省略可能退化為 Template Method。
  • 構建步驟簡單且產品介面一致時,可轉用 Factory Method。

注意事項

  • 回傳產品方法是否必須、是否在抽象建造者定義,視實況:統一介面可在抽象層定義;無統一介面在具體建造者各自實現;單一產品類型甚至可省略(本例即如此)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved