C# 建造者模式(Builder Pattern)详细讲解

一、什么是建造者模式?

建造者模式(Builder Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这个模式主要应用于那些构建过程复杂且涉及多个步骤的场景,特别适合于需要灵活配置且逐步构建的对象。

1.1. 设计模式分类

设计模式(Design Patterns)分为三大类:

  • 创建型模式(Creational Patterns):关注如何创建对象的设计模式。
  • 结构型模式(Structural Patterns):关注如何通过组合对象来构建更大的结构。
  • 行为型模式(Behavioral Patterns):关注对象之间如何进行交互和职责分配。

建造者模式属于创建型模式,它的目的是通过分步构建,避免构造复杂对象时需要过多的参数或复杂的配置。

1.2. 为什么使用建造者模式?

在许多情况下,我们会遇到这样的问题:某些对象非常复杂,构建它们时需要多个步骤,这些步骤又可能是可选的,或者需要根据不同的需求使用不同的配置。直接通过构造函数来构建这样复杂的对象,不仅代码重复,而且不易扩展。建造者模式通过将构建过程分解成多个步骤,使得对象的创建过程更具灵活性,且客户端代码更加简洁。

二、建造者模式的结构

建造者模式的核心思想是将对象的创建过程分成多个步骤,而这些步骤可以独立进行组合。 建造者模式一般包含以下几个组成部分:

2.1. 组成部分

  1. 产品类(Product)
    • 产品类是最终构建出来的对象,它通常是一个复杂对象,包含多个部件和属性。
  2. 抽象建造者(Builder)
    • 抽象建造者声明了构建产品的各个步骤,例如设置不同的部件,获取最终的产品等。通常是一个接口或者抽象类,提供一组构建方法。
  3. 具体建造者(Concrete Builder)
    • 具体建造者实现了抽象建造者的方法,并为构建产品的每一步提供具体的实现。它管理着产品的组成部分,并在最后生成产品。
  4. 指挥者(Director)
    • 指挥者负责定义构建过程的顺序,调用具体建造者的方法来完成复杂对象的构建。指挥者并不关心产品的具体细节,而是将构建过程委托给建造者来完成。

三、建造者模式的工作流程

建造者模式的工作流程通常如下:

  1. 客户创建一个指挥者对象,并通过它指定所需的建造者(通常是某个具体的建造者类)。
  2. 指挥者会按照顺序调用建造者中的各个方法,逐步构建产品。
  3. 具体建造者负责逐步构建产品的各个部分(如设置不同的部件或配置)。
  4. 最终产品在构建完成后返回给客户,客户可以根据需求使用该产品。

四、示例:构建一个复杂的汽车对象

4.1. 定义产品类:Car

在本例中,我们要构建的产品是一个复杂的 Car 类。该类有多个部件和属性,包括引擎类型、车轮数量、是否有 GPS、是否有天窗等。

public class Car
{public string Engine { get; set; }public int Wheels { get; set; }public bool HasGPS { get; set; }public bool HasSunroof { get; set; }public override string ToString(){return $"Car [Engine: {Engine}, Wheels: {Wheels}, GPS: {HasGPS}, Sunroof: {HasSunroof}]";}
}

Car 类有四个主要属性,分别是:Engine(引擎类型),Wheels(车轮数),HasGPS(是否有 GPS),HasSunroof(是否有天窗)。这些属性是构成汽车的基本部分。

4.2. 创建抽象建造者:ICarBuilder

ICarBuilder 是一个接口,定义了构建汽车的步骤(例如构建引擎、车轮、GPS 和天窗等):

public interface ICarBuilder
{void BuildEngine();void BuildWheels();void BuildGPS();void BuildSunroof();Car GetResult();
}

ICarBuilder 接口提供了五个方法:

  • BuildEngine():构建引擎。
  • BuildWheels():构建车轮。
  • BuildGPS():构建 GPS。
  • BuildSunroof():构建天窗。
  • GetResult():返回最终构建好的产品 Car 对象。

4.3. 创建具体建造者:SportsCarBuilder

SportsCarBuilder 类是一个具体的建造者,它实现了 ICarBuilder 接口,负责具体构建一个运动型汽车:

public class SportsCarBuilder : ICarBuilder
{private Car _car = new Car();public void BuildEngine(){_car.Engine = "V8 Engine"; // 运动型车的引擎}public void BuildWheels(){_car.Wheels = 4; // 标准运动型车有4个轮子}public void BuildGPS(){_car.HasGPS = true; // 运动型车需要 GPS}public void BuildSunroof(){_car.HasSunroof = true; // 运动型车有天窗}public Car GetResult(){return _car; // 返回构建好的汽车}
}

SportsCarBuilder 中,每个方法实现了具体的构建步骤,逐步设置汽车的属性。最后,GetResult() 方法返回构建完成的 Car 对象。

4.4. 创建指挥者:CarDirector

指挥者类 CarDirector 负责按照一定顺序调用建造者的方法来构建汽车:

public class CarDirector
{private ICarBuilder _carBuilder;public CarDirector(ICarBuilder carBuilder){_carBuilder = carBuilder;}public Car ConstructCar(){_carBuilder.BuildEngine();_carBuilder.BuildWheels();_carBuilder.BuildGPS();_carBuilder.BuildSunroof();return _carBuilder.GetResult();}
}

CarDirector 类使用 ICarBuilder 来完成汽车的构建过程。ConstructCar() 方法按照固定的顺序调用建造者的构建方法,最后返回构建好的汽车。

4.5. 客户端代码:如何使用建造者模式

客户端代码通过创建一个具体的建造者(如 SportsCarBuilder),然后将它传递给指挥者 CarDirector,最终得到一个构建好的汽车。

class Program
{static void Main(string[] args){// 创建具体的建造者ICarBuilder carBuilder = new SportsCarBuilder();// 创建指挥者CarDirector director = new CarDirector(carBuilder);// 指挥者构建汽车Car car = director.ConstructCar();// 输出结果Console.WriteLine(car);}
}

输出:

Car [Engine: V8 Engine, Wheels: 4, GPS: True, Sunroof: True]

在客户端中,我们通过 CarDirector 来构建一个带有 V8 引擎、4 个轮子、GPS 和天窗的运动型车。

五、建造者模式的优点与缺点

5.1. 优点

  1. 解耦产品的构建与表示

    • 建造者模式将对象的构建过程与最终的表示(对象的不同状态)分开,允许你独立于对象的具体表示方式构建复杂对象。
  2. 构建过程灵活

    • 同一个构建过程可以生成不同的产品。例如,你可以使用不同的建造者(如 SportsCarBuilderSUVCarBuilder)来构建不同类型的汽车。
  3. 代码清晰、可维护

    • 每个具体建造者只负责构建特定类型的产品,避免了复杂的构造函数或多个参数的使用,使得代码结构更加清晰。
  4. 适合复杂产品的创建

    • 当对象的构建过程复杂,且各个部件之间有多种组合方式时,建造者模式非常适合。

5.2. 缺点

  1. 需要更多的类

    • 由于每个不同的建造者需要实现一个接口,并为每个产品提供具体实现,因此在产品种类很多时,可能会创建多个建造者类,导致类的数量增加。
  2. 不能直接使用“简单对象”

    • 对于一些简单的对象,使用建造者模式可能会显得有些“过度设计”,特别是当对象没有复杂的构建步骤时,简单的构造函数可能更为直接。

六、总结

建造者模式是一种非常有效的设计模式,它提供了一种灵活的方式来构建复杂对象。通过分解构建过程并将其与具体的表示分离,建造者模式能够创建不同类型的对象,同时保持代码的清晰性和可维护性。在 C# 中,建造者模式适用于复杂对象的构建、逐步配置以及需要灵活控制构建过程的场景。

总结关键点:

  • 产品类:定义最终构建出来的复杂对象。
  • 建造者接口:定义构建对象的步骤。
  • 具体建造者:负责实现建造步骤并返回产品。
  • 指挥者:负责控制构建过程的顺序,调用建造者进行具体操作。

如果你需要在 C# 中处理复杂对象的创建,并且对象的构建步骤可能变化,或者存在多个变种,建造者模式将是一个非常好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34450.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创新技术引领软件供应链安全,助力数字中国建设

编者按 随着数字化转型的加速,针对软件供应链的攻击事件呈快速增长态势,目前已成为网络空间安全的焦点。如何将安全嵌入到软件开发到运营的全流程,实现防护技术的自动化、一体化、智能化,成为技术领域追逐的热点。 悬镜安全作为…

PyTorch 系列教程:使用CNN实现图像分类

图像分类是计算机视觉领域的一项基本任务,也是深度学习技术的一个常见应用。近年来,卷积神经网络(cnn)和PyTorch库的结合由于其易用性和鲁棒性已经成为执行图像分类的流行选择。 理解卷积神经网络(cnn) 卷…

【2025】基于python+django的驾校招生培训管理系统(源码、万字文档、图文修改、调试答疑)

课题功能结构图如下: 驾校招生培训管理系统设计 一、课题背景 随着机动车保有量的不断增加,人们对驾驶技能的需求也日益增长。驾校作为驾驶培训的主要机构,面临着激烈的市场竞争和学员需求多样化等挑战。传统的驾校管理模式往往依赖于人工操作…

【JavaWeb】快速入门——HTMLCSS

文章目录 一、 HTML简介1、HTML概念2、HTML文件结构3、可视化网页结构 二、 HTML标签语法1、标题标签2、段落标签3、超链接4、换行5、无序列表6、路径7、图片8、块1 盒子模型2 布局标签 三、 使用HTML表格展示数据1、定义表格2、合并单元格横向合并纵向合并 四、 使用HTML表单收…

MySQL 优化方案

一、MySQL 查询过程 MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器,再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作,包括连接管理、查询解析、优化、执行和结果返回等。 1.1 查询过程的关键组件 连接管理器:管理…

服务性能防腐体系:基于自动化压测的熔断机制

01# 背景 在系统架构的演进过程中,项目初始阶段都会通过压力测试构建安全护城河,此时的服务性能与资源水位保持着黄金比例关系。然而在业务高速发展时期,每个冲刺周期都被切割成以业务需求为单位的开发单元,压力测试逐渐从必选项…

六十天前端强化训练之第二十天React Router 基础详解

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、核心概念 1.1 核心组件 1.2 路由模式对比 二、核心代码示例 2.1 基础路由配置 2.2 动态路由示例 2.3 嵌套路由实现 2.4 完整示例代码 三、关键功能实现效果 四、…

grad_traj_optimization 开源项目

开源项目 grad_traj_optimization 使用教程-CSDN博客 ubuntu如何切换到root用户_ubuntu切换到root用户-CSDN博客 catkin_make: command not found 解决办法_catkin-make not found-CSDN博客 这就说明需要编译的package虽然存在,但不在指定的目录下。catkin_make命…

深圳南柯电子|净水器EMC测试整改:水质安全与电磁兼容性的双赢

在当今注重健康生活的时代,净水器作为家庭用水安全的第一道防线,其性能与安全性备受关注。其中,电磁兼容性(EMC)测试是净水器产品上市前不可或缺的一环,它直接关系到产品在复杂电磁环境中的稳定运行及不对其…

要登录的设备ip未知时的处理方法

目录 1 应用场景... 1 2 解决方法:... 1 2.1 wireshark设置... 1 2.2 获取网口mac地址,wireshark抓包前预过滤掉自身mac地址的影响。... 2 2.3 pc网口和设备对接... 3 2.3.1 情况1:... 3 2.3.2 情…

GHCTF web方向题解

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…

Vision Transformer (ViT):将Transformer带入计算机视觉的革命性尝试(代码实现)

Vision Transformer (ViT):将Transformer带入计算机视觉的革命性尝试 作为一名深度学习研究者,如果你对自然语言处理(NLP)领域的Transformer架构了如指掌,那么你一定不会对它在序列建模中的强大能力感到陌生。然而&am…

蓝耘携手通义万象 2.1 图生视频:开启创意无限的共享新时代

在科技飞速发展的今天,各种新奇的技术不断涌现,改变着我们的生活和工作方式。蓝耘和通义万象 2.1 图生视频就是其中两项非常厉害的技术。蓝耘就像是一个超级大管家,能把各种资源管理得井井有条;而通义万象 2.1 图生视频则像是一个…

IEC61850标准下MMS 缓存报告控制块 ResvTms详细解析

IEC61850标准是电力系统自动化领域唯一的全球通用标准。IEC61850通过标准的实现,使得智能变电站的工程实施变得规范、统一和透明,这大大提高了变电站自动化系统的技术水平和安全稳定运行水平。 在 IEC61850 标准体系中,ResvTms(r…

【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI助理,无惧任务提交失败的压力。 一、环境准备 1. 安装依赖库 …

蓝思科技冲刺港股上市,双重上市的意欲何为?

首先,蓝思科技冲刺港股上市,这一举措是其国际化战略进入实质性阶段的重要标志。通过港股上市,蓝思科技有望进一步拓宽融资渠道,这不仅能够为公司带来更加多元化的资金来源,还能够降低对单一市场的依赖风险,…

深入探讨RAID 5的性能与容错能力:实验与分析(磁盘阵列)

前言—— 本实验旨在探讨 RAID 5 的性能和容错能力。通过创建 RAID 5 阵列并进行一系列读写性能测试及故障模拟,我们将观察 RAID 5 在数据冗余和故障恢复方面的表现,以验证其在实际应用中的可靠性和效率。 首先说明:最少三块硬盘, 使用 4 块…

excel中两个表格的合并

使用函数: VLOOKUP函数 如果涉及在excel中两个工作表之间进行配对合并,则: VLOOKUP(C1,工作表名字!A:B,2,0) 参考: excel表格中vlookup函数的使用方法步骤https://haokan.baidu.com/v?pdwisenatural&vid132733503560775…

基于ssm的宠物医院信息管理系统(全套)

一、系统架构 前端:html | layui | vue | element-ui 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat | idea | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页…

UE小:UE5.5 PixelStreamingInfrastructure 使用时注意事项

1、鼠标默认显示 player.ts中的Config中添加HoveringMouse:true 然后运行typescript\package.json中的"build":npx webpack --config webpack.prod.js