【设计模式】1. 构建器模式(Builder Pattern)是一种创建型设计模式

devtools/2024/11/29 2:33:38/

构建器模式(Builder Pattern)是一种创建型设计模式,用于分步骤构建复杂对象,同时允许按照不同的需求生成不同的表示。该模式将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的对象。


核心思想

构建器模式通过将对象的构造过程抽象化为多个步骤,使得构造过程可以灵活调整,甚至可以动态选择具体的构建器以生成不同的对象。这样可以解决在复杂对象构建时,代码变得冗长、难以维护的问题。


参与者

  1. 产品(Product)

    • 要创建的复杂对象。
    • 包含多个部件。
    • 例如:一个汽车、一个用户界面。
  2. 构建器接口(Builder)

    • 定义构建产品的步骤。
    • 通常包括添加部件的方法。
  3. 具体构建器(Concrete Builder)

    • 实现构建器接口。
    • 负责具体实现如何一步步地构造产品。
    • 它维护一个具体的产品实例。
  4. 指导者(Director)

    • 控制构建过程的逻辑和顺序。
    • 知道如何使用构建器来创建产品。
  5. 客户代码(Client)

    • 指定需要构建的产品类型,并提供相关的参数。
    • 使用指导者调用构建器完成产品构建。

示例代码(C#)

以下是一个简单的汽车建造器的例子:

// 产品:汽车
class Car
{public string Engine { get; set; }public string Wheels { get; set; }public string Body { get; set; }public override string ToString(){return $"Engine: {Engine}, Wheels: {Wheels}, Body: {Body}";}
}// 构建器接口
interface ICarBuilder
{void BuildEngine();void BuildWheels();void BuildBody();Car GetCar();
}// 具体构建器
class SportsCarBuilder : ICarBuilder
{private Car _car = new Car();public void BuildEngine(){_car.Engine = "V8 Engine";}public void BuildWheels(){_car.Wheels = "Sport Wheels";}public void BuildBody(){_car.Body = "Sport Body";}public Car GetCar(){return _car;}
}// 指导者
class Director
{private ICarBuilder _builder;public Director(ICarBuilder builder){_builder = builder;}public void Construct(){_builder.BuildEngine();_builder.BuildWheels();_builder.BuildBody();}
}// 客户代码
class Program
{static void Main(string[] args){// 使用具体构建器ICarBuilder builder = new SportsCarBuilder();Director director = new Director(builder);// 指导者负责构建产品director.Construct();// 获取构建好的产品Car car = builder.GetCar();Console.WriteLine(car);}
}

优点

  1. 易于扩展:可以通过添加新的具体构建器支持更多产品表示。
  2. 分离复杂对象的创建和表示:更清晰地组织代码。
  3. 灵活性:可以根据需要动态调整构造步骤。

缺点

  1. 增加代码复杂性:需要引入多个类和接口。
  2. 适用场景有限:主要适用于需要分步骤构建的复杂对象。

使用场景

  1. 构建一个由多个组件组成的复杂对象,例如生成器游戏关卡、配置文件生成等。
  2. 需要生成多个不同表示的对象,但构造过程相似。
  3. 希望控制对象的构造步骤,而不直接依赖产品的细节。

构建器模式的设计理念在于简化复杂对象的构建,并提供灵活性以适应变化。

个人经验:

1. 可以和类内类Builder和链式调用一起用,用Builder. SetEngine(x,x),SetWheel(),build() 链式调用构建。

public class Product
{// 私有构造函数,防止直接实例化private Product() { }// 产品的属性public Type1 Property1 { get; private set; }public Type2 Property2 { get; private set; }public Type3 Property3 { get; private set; }// Builder类public class Builder{private Product _product = new Product();// 链式方法,每个都返回Builder实例public Builder WithProperty1(Type1 value){_product.Property1 = value;return this;}public Builder WithProperty2(Type2 value){_product.Property2 = value;return this;}public Builder WithProperty3(Type3 value){_product.Property3 = value;return this;}// 最终构建方法public Product Build(){// 可以在这里添加参数验证return _product;}}
}核心要点:外部类私有构造函数
内部Builder类
链式方法返回Builder本身
Build()方法返回最终产品

调用方式

var product = new Product.Builder().WithProperty1(value1).WithProperty2(value2).WithProperty3(value3).Build();


http://www.ppmy.cn/devtools/137811.html

相关文章

解锁 Vue 项目中 TSX 配置与应用简单攻略

在 Vue 项目中配置 TSX 写法 在 Vue 项目中使用 TSX 可以为我们带来更灵活、高效的开发体验,特别是在处理复杂组件逻辑和动态渲染时。以下是详细的配置步骤: 一、安装相关依赖 首先,我们需要在命令行中输入以下命令来安装 vitejs/plugin-v…

Linux 共享环境搭建

NFS网络文件系统 说明:这个主要是应用于Linux系统与Linux系统之间的通信。 服务端 步骤: 在被共享的系统中安装nfs服务 sudo apt-get install nfs-kernel-server注意:如果系统提示无法定位软件包,就需要更新软件源 sudo apt-g…

【STM32】MPU6050简介

文章目录 MPU6050简介MPU6050关键块带有16位ADC和信号调理的三轴MEMS陀螺仪具有16位ADC和信号调理的三轴MEMS加速度计I2C串行通信接口 MPU6050对应的数据手册:MPU6050 陀螺仪加速度计 链接: https://pan.baidu.com/s/13nwEhGvsfxx0euR2hMHsyw?pwdv2i6 提取码: v2i6…

Python 网络爬虫进阶:动态网页爬取与反爬机制应对

在上一篇文章中,我们学习了如何使用 Python 构建一个基本的网络爬虫。然而,在实际应用中,许多网站使用动态内容加载或实现反爬机制来阻止未经授权的抓取。因此,本篇文章将深入探讨以下进阶主题: 如何处理动态加载的网…

IC数字后端实现之大厂IC笔试真题(经典时序计算和时序分析题)

今天小编给大家分享下每年IC秋招春招必考题目——静态时序分析时序分析题。 数字IC后端笔试面试题库 | 经典时序Timing计算题 时序分析题1: 给定如下图所示的timing report,请回答一下几个问题。 1)这是一条setup还是hold的timing report?…

python-解决一元一次方程

【题目】解决一元一次方程数学问题 【问题描述】 我们要解决一个较为复杂的一元一次方程数学问题,方程形如:ax b c,其中a、b、c为已知常数,x为未知数。 现在我们要通过编程的方式解决这个问题,即找到方程的解x。 【…

ubuntu 安装 docker 记录

本文假设系统为 Ubuntu,从 16.04 到 24.04,且通过 APT 命令安装。理论上也其他 Debian 系的操作系统。 WSL 也一样。 感觉 Docker 官方在强推 Docker Desktop,搜索 Docker 安装文档,一不小心就被导航到了 Docker Desktop 的安装页…

什么是 C++ 中的函数对象?它有什么特点?函数对象与普通函数有什么区别? 如何定义和使用函数对象?

1)什么是 C 中的函数对象?它有什么特点? 在 C中,函数对象(也称为函数符或仿函数)是一个可以像函数一样被调用的对象。 函数对象是指该对象具备函数的行为函数对象,是通过()调用操作符声明得到的,然后便能通…