福田做商城网站建设哪家服务周到,免费网站模版建设,app模板,做网站 郑州公司引言
在软件开发中#xff0c;有时我们需要创建一个由多个部分组成的复杂对象#xff0c;这些部分可能有不同的变体或配置。如果直接在一个构造函数中设置所有参数#xff0c;代码会变得难以阅读和维护。当对象构建过程复杂#xff0c;且需要多个步骤时#xff0c;我们可…引言
在软件开发中有时我们需要创建一个由多个部分组成的复杂对象这些部分可能有不同的变体或配置。如果直接在一个构造函数中设置所有参数代码会变得难以阅读和维护。当对象构建过程复杂且需要多个步骤时我们可能会陷入伸缩式构造函数的困境或者创建大量的子类来处理各种组合。
建造者模式Builder Pattern提供了一种更优雅的解决方案它将一个复杂对象的构建过程与其表示分离使得同样的构建过程可以创建不同的表示。这种模式特别适用于需要分步骤创建复杂对象的场景或者当对象的创建涉及大量参数时。
本文将深入探讨建造者模式的概念、实现方式、应用场景以及优缺点并通过C#代码示例来展示其实际应用。 文章目录 引言建造者模式定义建造者模式的UML类图建造者模式的组成部分建造者模式的实现方式基本实现使用链式调用的流畅接口使用指挥者角色 建造者模式的应用场景复杂对象的创建参数众多的构造函数不同表示的构建过程 建造者模式的优缺点优点缺点 总结相关学习资源 建造者模式定义
建造者模式Builder Pattern的定义是将一个复杂对象的构建与它的表示分离使得同样的构建过程可以创建不同的表示。
建造者模式属于创建型设计模式它解决的核心问题包括
如何构建一个由多个部分组成的复杂对象如何避免伸缩式构造函数的问题如何允许对象有不同的表示形式如何分离对象的构建和表示
建造者模式的UML类图
以下是建造者模式的UML类图 #mermaid-svg-iC7kxARGMIYfxvzD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iC7kxARGMIYfxvzD .error-icon{fill:#552222;}#mermaid-svg-iC7kxARGMIYfxvzD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iC7kxARGMIYfxvzD .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-iC7kxARGMIYfxvzD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iC7kxARGMIYfxvzD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iC7kxARGMIYfxvzD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iC7kxARGMIYfxvzD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iC7kxARGMIYfxvzD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iC7kxARGMIYfxvzD .marker.cross{stroke:#333333;}#mermaid-svg-iC7kxARGMIYfxvzD svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iC7kxARGMIYfxvzD g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-iC7kxARGMIYfxvzD g.classGroup text .title{font-weight:bolder;}#mermaid-svg-iC7kxARGMIYfxvzD .nodeLabel,#mermaid-svg-iC7kxARGMIYfxvzD .edgeLabel{color:#131300;}#mermaid-svg-iC7kxARGMIYfxvzD .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-iC7kxARGMIYfxvzD .label text{fill:#131300;}#mermaid-svg-iC7kxARGMIYfxvzD .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-iC7kxARGMIYfxvzD .classTitle{font-weight:bolder;}#mermaid-svg-iC7kxARGMIYfxvzD .node rect,#mermaid-svg-iC7kxARGMIYfxvzD .node circle,#mermaid-svg-iC7kxARGMIYfxvzD .node ellipse,#mermaid-svg-iC7kxARGMIYfxvzD .node polygon,#mermaid-svg-iC7kxARGMIYfxvzD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iC7kxARGMIYfxvzD .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-iC7kxARGMIYfxvzD g.clickable{cursor:pointer;}#mermaid-svg-iC7kxARGMIYfxvzD g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-iC7kxARGMIYfxvzD g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-iC7kxARGMIYfxvzD .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-iC7kxARGMIYfxvzD .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-iC7kxARGMIYfxvzD .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-iC7kxARGMIYfxvzD .dashed-line{stroke-dasharray:3;}#mermaid-svg-iC7kxARGMIYfxvzD #compositionStart,#mermaid-svg-iC7kxARGMIYfxvzD .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-iC7kxARGMIYfxvzD #compositionEnd,#mermaid-svg-iC7kxARGMIYfxvzD .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-iC7kxARGMIYfxvzD #dependencyStart,#mermaid-svg-iC7kxARGMIYfxvzD .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-iC7kxARGMIYfxvzD #dependencyStart,#mermaid-svg-iC7kxARGMIYfxvzD .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-iC7kxARGMIYfxvzD #extensionStart,#mermaid-svg-iC7kxARGMIYfxvzD .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-iC7kxARGMIYfxvzD #extensionEnd,#mermaid-svg-iC7kxARGMIYfxvzD .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-iC7kxARGMIYfxvzD #aggregationStart,#mermaid-svg-iC7kxARGMIYfxvzD .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-iC7kxARGMIYfxvzD #aggregationEnd,#mermaid-svg-iC7kxARGMIYfxvzD .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-iC7kxARGMIYfxvzD .edgeTerminals{font-size:11px;}#mermaid-svg-iC7kxARGMIYfxvzD :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} directs creates creates Director Construct(builder: Builder) Builder BuildPartA() BuildPartB() BuildPartC() GetResult() ConcreteBuilder1 product: Product BuildPartA() BuildPartB() BuildPartC() GetResult() ConcreteBuilder2 product: Product BuildPartA() BuildPartB() BuildPartC() GetResult() Product partA: string partB: string partC: string Show() 建造者模式的组成部分
建造者模式包含以下几个核心组件 产品Product 被构建的复杂对象包含多个组成部分具体建造者创建该产品的内部表示并定义装配过程 抽象建造者Builder 声明创建产品各个部分的抽象接口定义构建产品各个部分的方法声明返回产品的方法 具体建造者Concrete Builder 实现抽象建造者的接口定义并跟踪它所创建的产品提供检索产品的方法实现构建产品各个部分的细节 指挥者Director 构造一个使用Builder接口的对象指导构建过程的顺序隐藏产品是如何组装的细节
客户端代码通常会创建一个具体建造者对象将其传递给指挥者然后通过指挥者开始构建过程。当构建过程完成后客户端从建造者中获取产品。
建造者模式的实现方式
下面通过C#代码示例展示建造者模式的几种实现方式。
基本实现
首先让我们看一个食品订单系统的例子实现不同类型的餐点组合
/// summary
/// 产品类 - 表示餐点
/// /summary
public class Meal
{// 餐点的各个组成部分public string MainCourse { get; set; }public string SideDish { get; set; }public string Drink { get; set; }public string Dessert { get; set; }/// summary/// 显示餐点的完整信息/// /summarypublic void ShowMeal(){Console.WriteLine(餐点信息:);Console.WriteLine($- 主菜: {MainCourse ?? 无});Console.WriteLine($- 配菜: {SideDish ?? 无});Console.WriteLine($- 饮料: {Drink ?? 无});Console.WriteLine($- 甜点: {Dessert ?? 无});}
}/// summary
/// 抽象建造者 - 定义创建餐点各部分的方法
/// /summary
public interface IMealBuilder
{void BuildMainCourse();void BuildSideDish();void BuildDrink();void BuildDessert();Meal GetMeal();
}/// summary
/// 具体建造者 - 健康餐点建造者
/// /summary
public class HealthyMealBuilder : IMealBuilder
{private Meal _meal new Meal();public void BuildMainCourse(){_meal.MainCourse 烤鸡胸肉;}public void BuildSideDish(){_meal.SideDish 蒸蔬菜;}public void BuildDrink(){_meal.Drink 矿泉水;}public void BuildDessert(){_meal.Dessert 水果沙拉;}public Meal GetMeal(){return _meal;}
}/// summary
/// 具体建造者 - 快餐建造者
/// /summary
public class FastFoodMealBuilder : IMealBuilder
{private Meal _meal new Meal();public void BuildMainCourse(){_meal.MainCourse 汉堡;}public void BuildSideDish(){_meal.SideDish 炸薯条;}public void BuildDrink(){_meal.Drink 可乐;}public void BuildDessert(){_meal.Dessert 冰淇淋;}public Meal GetMeal(){return _meal;}
}/// summary
/// 指挥者 - 负责构建过程
/// /summary
public class MealDirector
{/// summary/// 构建完整餐点/// /summary/// param namebuilder餐点建造者/param/// returns构建好的餐点/returnspublic Meal ConstructFullMeal(IMealBuilder builder){builder.BuildMainCourse();builder.BuildSideDish();builder.BuildDrink();builder.BuildDessert();return builder.GetMeal();}/// summary/// 构建没有甜点的餐点/// /summary/// param namebuilder餐点建造者/param/// returns构建好的餐点/returnspublic Meal ConstructMealWithoutDessert(IMealBuilder builder){builder.BuildMainCourse();builder.BuildSideDish();builder.BuildDrink();return builder.GetMeal();}
}/// summary
/// 客户端代码
/// /summary
public class Client
{public static void Run(){// 创建指挥者var director new MealDirector();// 使用健康餐点建造者var healthyBuilder new HealthyMealBuilder();var healthyMeal director.ConstructFullMeal(healthyBuilder);Console.WriteLine(健康餐点:);healthyMeal.ShowMeal();// 使用快餐建造者不含甜点var fastFoodBuilder new FastFoodMealBuilder();var fastFoodMeal director.ConstructMealWithoutDessert(fastFoodBuilder);Console.WriteLine(\n快餐餐点(无甜点):);fastFoodMeal.ShowMeal();}
}// 执行客户端代码
Client.Run();/* 输出结果
健康餐点:
餐点信息:
- 主菜: 烤鸡胸肉
- 配菜: 蒸蔬菜
- 饮料: 矿泉水
- 甜点: 水果沙拉快餐餐点(无甜点):
餐点信息:
- 主菜: 汉堡
- 配菜: 炸薯条
- 饮料: 可乐
- 甜点: 无
*/在这个基本实现中
Meal 是被构建的产品IMealBuilder 是抽象建造者定义了构建餐点各部分的方法HealthyMealBuilder 和 FastFoodMealBuilder 是具体建造者实现了不同风格的餐点创建MealDirector 是指挥者控制构建过程的顺序客户端可以选择不同的建造者来创建不同类型的餐点以及选择不同的构建方式完整或无甜点
使用链式调用的流畅接口
建造者模式的一个常见变体是使用方法链链式调用创建流畅接口这在C#中特别常见
/// summary
/// 产品类 - 电子邮件
/// /summary
public class Email
{// 电子邮件的各个组成部分public string From { get; set; }public string To { get; set; }public string Subject { get; set; }public string Body { get; set; }public Liststring Attachments { get; set; } new Liststring();public bool IsHtml { get; set; }public string Cc { get; set; }public string Bcc { get; set; }/// summary/// 显示电子邮件的内容/// /summarypublic void Display(){Console.WriteLine(电子邮件详情:);Console.WriteLine($发件人: {From});Console.WriteLine($收件人: {To});if (!string.IsNullOrEmpty(Cc)) Console.WriteLine($抄送: {Cc});if (!string.IsNullOrEmpty(Bcc)) Console.WriteLine($密送: {Bcc});Console.WriteLine($主题: {Subject});Console.WriteLine($正文: {Body});Console.WriteLine($格式: {(IsHtml ? HTML : 纯文本)});if (Attachments.Count 0){Console.WriteLine(附件:);foreach (var attachment in Attachments){Console.WriteLine($- {attachment});}}}
}/// summary
/// 流畅接口建造者 - 电子邮件建造者
/// /summary
public class EmailBuilder
{private readonly Email _email new Email();/// summary/// 设置发件人地址/// /summary/// param namefrom发件人邮箱地址/param/// returns当前建造者实例以支持链式调用/returnspublic EmailBuilder From(string from){_email.From from;return this;}/// summary/// 设置收件人地址/// /summary/// param nameto收件人邮箱地址/param/// returns当前建造者实例以支持链式调用/returnspublic EmailBuilder To(string to){_email.To to;return this;}/// summary/// 设置邮件主题/// /summary/// param namesubject邮件主题/param/// returns当前建造者实例以支持链式调用/returnspublic EmailBuilder WithSubject(string subject){_email.Subject subject;return this;}/// summary/// 设置邮件正文内容/// /summary/// param namebody邮件内容/param/// returns当前建造者实例以支持链式调用/returnspublic EmailBuilder WithBody(string body){_email.Body body;return this;}/// summary/// 添加附件/// /summary/// param nameattachment附件路径/param/// returns当前建造者实例以支持链式调用/returnspublic EmailBuilder WithAttachment(string attachment){_email.Attachments.Add(attachment);return this;}/// summary/// 设置邮件为HTML格式/// /summary/// param nameisHtml是否是HTML格式/param/// returns当前建造者实例以支持链式调用/returnspublic EmailBuilder AsHtml(bool isHtml true){_email.IsHtml isHtml;return this;}/// summary/// 设置抄送地址/// /summary/// param namecc抄送邮箱地址/param/// returns当前建造者实例以支持链式调用/returnspublic EmailBuilder WithCc(string cc){_email.Cc cc;return this;}/// summary/// 设置密送地址/// /summary/// param namebcc密送邮箱地址/param/// returns当前建造者实例以支持链式调用/returnspublic EmailBuilder WithBcc(string bcc){_email.Bcc bcc;return this;}/// summary/// 构建电子邮件对象/// /summary/// returns构建好的电子邮件/returnspublic Email Build(){// 这里可以添加验证逻辑例如检查必填字段if (string.IsNullOrEmpty(_email.From))throw new InvalidOperationException(发件人地址不能为空);if (string.IsNullOrEmpty(_email.To))throw new InvalidOperationException(收件人地址不能为空);return _email;}
}// 客户端代码
public class FluentClient
{public static void Run(){// 使用流畅接口创建一封简单邮件var simpleEmail new EmailBuilder().From(senderexample.com).To(recipientexample.com).WithSubject(问候邮件).WithBody(您好这是一封测试邮件。).Build();Console.WriteLine(简单邮件:);simpleEmail.Display();// 使用流畅接口创建一封复杂邮件var complexEmail new EmailBuilder().From(managercompany.com).To(teamcompany.com).WithCc(supervisorcompany.com).WithBcc(recordscompany.com).WithSubject(项目进度报告).WithBody(h1项目进度/h1p团队成员们请查看附件中的项目进度报告。/p).AsHtml().WithAttachment(progress_report.pdf).WithAttachment(schedule.xlsx).Build();Console.WriteLine(\n复杂邮件:);complexEmail.Display();}
}// 执行客户端代码
FluentClient.Run();/* 输出结果
简单邮件:
电子邮件详情:
发件人: senderexample.com
收件人: recipientexample.com
主题: 问候邮件
正文: 您好这是一封测试邮件。
格式: 纯文本复杂邮件:
电子邮件详情:
发件人: managercompany.com
收件人: teamcompany.com
抄送: supervisorcompany.com
密送: recordscompany.com
主题: 项目进度报告
正文: h1项目进度/h1p团队成员们请查看附件中的项目进度报告。/p
格式: HTML
附件:
- progress_report.pdf
- schedule.xlsx
*/在这个流畅接口实现中
每个设置方法返回建造者本身这使得可以链式调用方法提供了一种更加简洁、可读性更高的方式来构建复杂对象允许按需设置各个属性支持可选参数在最后调用Build()方法来获取构建好的对象同时可以进行必要的验证
使用指挥者角色
在一些更复杂的场景中指挥者Director角色可以更好地封装不同的构建过程。下面是一个使用指挥者角色的计算机配置示例
/// summary
/// 产品类 - 计算机
/// /summary
public class Computer
{// 计算机的各个组件public string CPU { get; set; }public string RAM { get; set; }public string Storage { get; set; }public string GraphicsCard { get; set; }public string Monitor { get; set; }public string OperatingSystem { get; set; }/// summary/// 显示计算机配置/// /summarypublic void ShowConfiguration(){Console.WriteLine(计算机配置:);Console.WriteLine($CPU: {CPU ?? 未指定});Console.WriteLine($内存: {RAM ?? 未指定});Console.WriteLine($存储: {Storage ?? 未指定});Console.WriteLine($显卡: {GraphicsCard ?? 未指定});Console.WriteLine($显示器: {Monitor ?? 未指定});Console.WriteLine($操作系统: {OperatingSystem ?? 未指定});}
}/// summary
/// 抽象建造者 - 计算机建造者
/// /summary
public interface IComputerBuilder
{void BuildCPU();void BuildRAM();void BuildStorage();void BuildGraphicsCard();void BuildMonitor();void InstallOperatingSystem();Computer GetComputer();
}/// summary
/// 具体建造者 - 游戏计算机建造者
/// /summary
public class GamingComputerBuilder : IComputerBuilder
{private Computer _computer new Computer();public void BuildCPU(){_computer.CPU Intel Core i9-11900K;}public void BuildRAM(){_computer.RAM 32GB DDR4 3600MHz;}public void BuildStorage(){_computer.Storage 2TB NVMe SSD;}public void BuildGraphicsCard(){_computer.GraphicsCard NVIDIA GeForce RTX 3080;}public void BuildMonitor(){_computer.Monitor 27英寸 4K 144Hz 游戏显示器;}public void InstallOperatingSystem(){_computer.OperatingSystem Windows 11 Pro;}public Computer GetComputer(){return _computer;}
}/// summary
/// 具体建造者 - 办公计算机建造者
/// /summary
public class OfficeComputerBuilder : IComputerBuilder
{private Computer _computer new Computer();public void BuildCPU(){_computer.CPU Intel Core i5-11400;}public void BuildRAM(){_computer.RAM 16GB DDR4 2666MHz;}public void BuildStorage(){_computer.Storage 512GB SSD;}public void BuildGraphicsCard(){_computer.GraphicsCard 集成显卡;}public void BuildMonitor(){_computer.Monitor 24英寸 1080p 办公显示器;}public void InstallOperatingSystem(){_computer.OperatingSystem Windows 10 专业版;}public Computer GetComputer(){return _computer;}
}/// summary
/// 具体建造者 - 开发计算机建造者
/// /summary
public class DeveloperComputerBuilder : IComputerBuilder
{private Computer _computer new Computer();public void BuildCPU(){_computer.CPU AMD Ryzen 9 5900X;}public void BuildRAM(){_computer.RAM 64GB DDR4 3200MHz;}public void BuildStorage(){_computer.Storage 1TB NVMe SSD 2TB HDD;}public void BuildGraphicsCard(){_computer.GraphicsCard NVIDIA GeForce RTX 3060;}public void BuildMonitor(){_computer.Monitor 双 27英寸 4K 专业显示器;}public void InstallOperatingSystem(){_computer.OperatingSystem Ubuntu 22.04 LTS;}public Computer GetComputer(){return _computer;}
}/// summary
/// 指挥者 - 计算机装配指挥者
/// /summary
public class ComputerDirector
{/// summary/// 构建完整计算机/// /summary/// param namebuilder计算机建造者/param/// returns构建好的计算机/returnspublic Computer BuildFullComputer(IComputerBuilder builder){builder.BuildCPU();builder.BuildRAM();builder.BuildStorage();builder.BuildGraphicsCard();builder.BuildMonitor();builder.InstallOperatingSystem();return builder.GetComputer();}/// summary/// 构建基本计算机(无显卡、基本显示器)/// /summary/// param namebuilder计算机建造者/param/// returns构建好的计算机/returnspublic Computer BuildBasicComputer(IComputerBuilder builder){builder.BuildCPU();builder.BuildRAM();builder.BuildStorage();builder.InstallOperatingSystem();return builder.GetComputer();}/// summary/// 构建无操作系统的计算机/// /summary/// param namebuilder计算机建造者/param/// returns构建好的计算机/returnspublic Computer BuildComputerWithoutOS(IComputerBuilder builder){builder.BuildCPU();builder.BuildRAM();builder.BuildStorage();builder.BuildGraphicsCard();builder.BuildMonitor();return builder.GetComputer();}
}/// summary
/// 客户端代码
/// /summary
public class DirectorClient
{public static void Run(){// 创建指挥者var director new ComputerDirector();// 构建游戏计算机完整配置var gamingBuilder new GamingComputerBuilder();var gamingComputer director.BuildFullComputer(gamingBuilder);Console.WriteLine(游戏计算机配置:);gamingComputer.ShowConfiguration();// 构建基本办公计算机var officeBuilder new OfficeComputerBuilder();var officeComputer director.BuildBasicComputer(officeBuilder);Console.WriteLine(\n办公计算机配置:);officeComputer.ShowConfiguration();// 构建无操作系统的开发计算机var developerBuilder new DeveloperComputerBuilder();var developerComputer director.BuildComputerWithoutOS(developerBuilder);Console.WriteLine(\n开发计算机配置(无操作系统):);developerComputer.ShowConfiguration();}
}// 执行客户端代码
DirectorClient.Run();/* 输出结果
游戏计算机配置:
计算机配置:
CPU: Intel Core i9-11900K
内存: 32GB DDR4 3600MHz
存储: 2TB NVMe SSD
显卡: NVIDIA GeForce RTX 3080
显示器: 27英寸 4K 144Hz 游戏显示器
操作系统: Windows 11 Pro办公计算机配置:
计算机配置:
CPU: Intel Core i5-11400
内存: 16GB DDR4 2666MHz
存储: 512GB SSD
显卡: 未指定
显示器: 未指定
操作系统: Windows 10 专业版开发计算机配置(无操作系统):
计算机配置:
CPU: AMD Ryzen 9 5900X
内存: 64GB DDR4 3200MHz
存储: 1TB NVMe SSD 2TB HDD
显卡: NVIDIA GeForce RTX 3060
显示器: 双 27英寸 4K 专业显示器
操作系统: 未指定
*/在这个实现中
指挥者ComputerDirector定义了多种不同的构建过程完整、基本、无操作系统具体建造者GamingComputerBuilder、OfficeComputerBuilder、DeveloperComputerBuilder提供了不同的实现方式客户端可以选择不同的建造者和构建过程的组合以获得不同配置的计算机指挥者封装了构建过程使得客户端代码更加简洁
建造者模式的应用场景
建造者模式适用于以下场景 #mermaid-svg-kb0ITRLmsxASV7no {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kb0ITRLmsxASV7no .error-icon{fill:#552222;}#mermaid-svg-kb0ITRLmsxASV7no .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kb0ITRLmsxASV7no .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-kb0ITRLmsxASV7no .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kb0ITRLmsxASV7no .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kb0ITRLmsxASV7no .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kb0ITRLmsxASV7no .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kb0ITRLmsxASV7no .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kb0ITRLmsxASV7no .marker.cross{stroke:#333333;}#mermaid-svg-kb0ITRLmsxASV7no svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kb0ITRLmsxASV7no .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kb0ITRLmsxASV7no .cluster-label text{fill:#333;}#mermaid-svg-kb0ITRLmsxASV7no .cluster-label span{color:#333;}#mermaid-svg-kb0ITRLmsxASV7no .label text,#mermaid-svg-kb0ITRLmsxASV7no span{fill:#333;color:#333;}#mermaid-svg-kb0ITRLmsxASV7no .node rect,#mermaid-svg-kb0ITRLmsxASV7no .node circle,#mermaid-svg-kb0ITRLmsxASV7no .node ellipse,#mermaid-svg-kb0ITRLmsxASV7no .node polygon,#mermaid-svg-kb0ITRLmsxASV7no .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kb0ITRLmsxASV7no .node .label{text-align:center;}#mermaid-svg-kb0ITRLmsxASV7no .node.clickable{cursor:pointer;}#mermaid-svg-kb0ITRLmsxASV7no .arrowheadPath{fill:#333333;}#mermaid-svg-kb0ITRLmsxASV7no .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kb0ITRLmsxASV7no .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kb0ITRLmsxASV7no .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-kb0ITRLmsxASV7no .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-kb0ITRLmsxASV7no .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kb0ITRLmsxASV7no .cluster text{fill:#333;}#mermaid-svg-kb0ITRLmsxASV7no .cluster span{color:#333;}#mermaid-svg-kb0ITRLmsxASV7no div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kb0ITRLmsxASV7no :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 建造者模式应用场景 复杂对象的创建 参数众多的构造函数 不同表示的构建过程 分步构建对象 不变性对象的创建 复杂对象的创建
当对象包含多个部分或者构建需要多个步骤时建造者模式能够提供清晰的创建过程
文档生成器如HTML、PDF、Word文档复杂的图形用户界面构建配置对象的创建复杂的数据转换和导出
参数众多的构造函数
在需要处理大量可选参数时建造者模式可以避免伸缩式构造函数问题
避免了使用多个重载构造函数避免了使用大量参数的构造函数允许仅设置需要的参数代码可读性和可维护性更高
不同表示的构建过程
当同一个构建过程可以创建不同表示的对象时建造者模式特别有用
不同格式的报告生成不同风格的UI组件创建不同平台的代码生成器
建造者模式的优缺点
优点 分离构建和表示建造者模式将对象的构建过程与其表示分离使得同样的构建过程可以创建不同的表示。 封装变化产品的内部结构可以变化而不会影响客户端代码因为客户端只与抽象接口交互。 更好的控制构建过程建造者模式允许对对象的构建过程进行更精细的控制特别是在复杂对象的构建中。 隐藏产品的内部结构产品的具体细节对客户端是不可见的客户端只需要与建造者交互。 提高代码可读性特别是在使用流畅接口时构建过程清晰易读。
缺点 增加类的数量建造者模式引入了多个新的类这可能增加系统的复杂性。 与特定类型绑定每个具体建造者与特定的产品类型绑定限制了灵活性。 不适合简单对象对于简单对象使用建造者模式可能是过度设计。 指挥者可能不总是必要的在一些实现中特别是使用流畅接口时指挥者角色可能是多余的。 可能导致代码重复不同的具体建造者可能包含相似的代码。
总结
建造者模式是一种功能强大的创建型设计模式它允许我们分步骤创建复杂对象并且可以使用相同的构建过程创建不同的表示。这种模式特别适合处理具有多个组成部分或需要复杂构建过程的对象。
在C#中建造者模式有多种实现方式从传统的实现使用抽象建造者、具体建造者和指挥者到更现代的流畅接口实现。流畅接口特别适合C#它提供了一种简洁、可读性强的方式来构建对象。
建造者模式与其他创建型模式如工厂方法和抽象工厂相比更加关注对象的分步构建过程而不仅仅是简单的实例化。它为控制复杂对象的创建过程提供了更细粒度的方法。
虽然建造者模式增加了代码的复杂性但在处理复杂对象创建、避免构造函数参数过多或需要不同表示的场景中这种复杂性是值得的。通过合理应用建造者模式我们可以创建更加灵活、可维护和可扩展的代码。
相关学习资源
网站资源
Refactoring Guru - Builder PatternMicrosoft Learn - Design PatternsSourceMaking - Builder Design PatternC# Corner - Builder Design Pattern in C#Dofactory - .NET Design Pattern Framework - Builder