C# 设计模式(创建型模式):建造者模式

embedded/2025/1/6 7:36:11/

C# 设计模式(创建型模式):建造者模式

引言

在软件开发中,创建型设计模式主要关注对象的创建方式,其中建造者模式(Builder Pattern)是非常重要的一种。建造者模式通过一步一步构建一个复杂对象,避免了在一个构造函数中传递过多的参数。它不仅可以让对象的构建过程独立于其表示,而且可以使得对象的构建过程更加灵活和可定制化。

本文将详细解析建造者模式的概念、应用场景,以及如何在C#中实现这一设计模式


1. 建造者模式概述

定义:

建造者模式是一种创建型设计模式,它允许通过多个步骤来构建一个复杂对象。每一个步骤构建一个部分,而最后将这些部分合成一个完整的对象。该模式的主要目的是将对象的构建过程与表示解耦,使得同样的构建过程可以创建不同的表示。

适用场景:
  • 当需要构建的对象具有复杂的内部结构。
  • 当对象的创建过程应该独立于其部件的具体表示时。
  • 当构建对象的过程包含多个步骤,且可能需要不同的实现时。

2. 建造者模式的结构

建造者模式通常由以下几个角色组成:

  • Product(产品类):表示被构建的复杂对象,包含多个部件。
  • Builder(建造者接口):定义创建产品的各个步骤接口。
  • ConcreteBuilder(具体建造者):实现了Builder接口,构建具体的产品。
  • Director(指挥者):负责构建一个复杂的对象,按照一定的顺序调用建造者的步骤。

3. C#中的建造者模式实现

代码示例:

假设我们要构建一个复杂的 Computer 对象,这个对象由不同的部件组成,例如CPU、内存、硬盘等。

  1. 定义产品类(Computer)
public class Computer
{public string CPU { get; set; }public string RAM { get; set; }public string Storage { get; set; }public override string ToString(){return $"Computer [CPU: {CPU}, RAM: {RAM}, Storage: {Storage}]";}
}
  1. 定义建造者接口(IComputerBuilder)
public interface IComputerBuilder
{void BuildCPU();void BuildRAM();void BuildStorage();Computer GetComputer();
}
  1. 实现具体建造者(ConcreteBuilder)
public class GamingComputerBuilder : IComputerBuilder
{private Computer _computer = new Computer();public void BuildCPU(){_computer.CPU = "Intel i9";}public void BuildRAM(){_computer.RAM = "32GB";}public void BuildStorage(){_computer.Storage = "1TB SSD";}public Computer GetComputer(){return _computer;}
}public class OfficeComputerBuilder : IComputerBuilder
{private Computer _computer = new Computer();public void BuildCPU(){_computer.CPU = "Intel i5";}public void BuildRAM(){_computer.RAM = "16GB";}public void BuildStorage(){_computer.Storage = "500GB HDD";}public Computer GetComputer(){return _computer;}
}
  1. 定义指挥者(Director)
public class ComputerDirector
{private readonly IComputerBuilder _builder;public ComputerDirector(IComputerBuilder builder){_builder = builder;}public Computer Construct(){_builder.BuildCPU();_builder.BuildRAM();_builder.BuildStorage();return _builder.GetComputer();}
}
  1. 使用建造者模式
class Program
{static void Main(string[] args){// 创建具体建造者IComputerBuilder gamingComputerBuilder = new GamingComputerBuilder();IComputerBuilder officeComputerBuilder = new OfficeComputerBuilder();// 创建指挥者ComputerDirector gamingDirector = new ComputerDirector(gamingComputerBuilder);ComputerDirector officeDirector = new ComputerDirector(officeComputerBuilder);// 构建不同的电脑Computer gamingComputer = gamingDirector.Construct();Computer officeComputer = officeDirector.Construct();Console.WriteLine(gamingComputer);Console.WriteLine(officeComputer);}
}
输出:
Computer [CPU: Intel i9, RAM: 32GB, Storage: 1TB SSD]
Computer [CPU: Intel i5, RAM: 16GB, Storage: 500GB HDD]

4. 建造者模式的优缺点

优点:
  • 高内聚:将构建过程集中在一个地方,便于管理和维护。
  • 灵活性强:可以创建不同类型的对象,而无需修改构建过程。
  • 解耦复杂性:将产品的构建和表示分离,使得它们可以独立变化。
  • 可扩展性:通过添加新的建造者,可以方便地扩展对象的构建方式。
缺点:
  • 类的数量增加:需要创建多个建造者类和指挥者类,可能导致类的数量增加,系统变得复杂。
  • 构建过程的复杂性:对于非常简单的对象,建造者模式可能显得过于繁琐。

5. 总结

建造者模式是一个非常强大的设计模式,它帮助我们在构建复杂对象时提供了一种灵活且可扩展的方式。通过将构建的各个步骤独立开来,我们不仅提高了代码的复用性,也使得系统在面对不同的需求变化时更加灵活。在C#开发中,建造者模式常用于创建具有多个部件的对象,特别适合于那些需要根据不同条件创建不同对象的场景。


如果你对建造者模式有任何疑问,或者有更多的实现细节需要探讨,欢迎在评论区留言讨论!


http://www.ppmy.cn/embedded/151394.html

相关文章

Mysql SQL 超实用的7个日期算术运算实例(10k)

文章目录 前言1. 加上或减去若干天、若干月或若干年基本语法使用场景注意事项运用实例分析说明2. 确定两个日期相差多少天基本语法使用场景注意事项运用实例分析说明3. 确定两个日期之间有多少个工作日基本语法使用场景注意事项运用实例分析说明4. 确定两个日期相隔多少个月或多…

php获取字符串中的汉字

在PHP中,可以使用正则表达式来提取字符串中的汉字。汉字通常位于Unicode范围\u4e00-\u9fa5之内,因此可以使用preg_match_all函数配合适当的正则表达式来实现。 以下是一个PHP代码示例,它会从给定的字符串中提取出所有的汉字: fu…

YK人工智能(三)——万字长文学会torch深度学习

2.1 张量 本节主要内容: 张量的简介PyTorch如何创建张量PyTorch中张量的操作PyTorch中张量的广播机制 2.1.1 简介 几何代数中定义的张量是基于向量和矩阵的推广,比如我们可以将标量视为零阶张量,矢量可以视为一阶张量,矩阵就是…

Cursor使用

Cursor是一款AI 代码编辑器,官网地址为https://www.cursor.com/. Cursor 功能详解 一、支持多种变成语言 Cursor 支持多种编程语言,包括 Python、JavaScript、HTML、CSS、Java 等。无论你是在开发网页、编写算法还是进行系统开发,Cursor 都…

Easticsearch介绍|实战?

Elasticsearch 是一个分布式的、RESTful 风格的搜索和数据分析引擎,适用于各种用例,如日志分析、全文搜索、实时应用监控等。它设计用来处理大量数据,并且可以快速地提供相关的搜索结果。以下是一些 Elasticsearch 的实战应用场景以及如何在这…

Android中创建ViewModel的几种方法

文章目录 1. 使用 `ViewModelProvider`1.1 在 `Activity` 中创建 `ViewModel`1.2 在 `Fragment` 中创建 `ViewModel`2. 使用 `ViewModelFactory`2.1 创建 `ViewModel` 和 `ViewModelFactory`2.2 在 `Activity` 或 `Fragment` 中使用 `ViewModelFactory`3. 使用 `by viewModels(…

推荐PWM通信控制电机应用32位单片机

电机控制MCU是现代电机驱动系统中不可或缺的核心组件。这些高性能的微处理器不仅具备强大的计算能力,还拥有丰富的外设接口,能够与各种传感器和执行器无缝连接。 在使用MCU进行脉冲宽度调制(PWM)通信以控制电机的应用中&#xff…

高速网络数据包处理中的内核旁路技术

该PPT详细介绍了Linux网络栈中数据包的传输路径、内核旁路技术的必要性以及具体的内核旁路技术,包括用户空间数据包处理和用户空间网络栈。主要内容概述: 数据包在Linux网络栈中的旅程:描述了数据包从发送到接收的完整路径,包括各…