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

ops/2024/11/28 21:29:53/

构建器模式(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/ops/137478.html

相关文章

Go 中的并发 Map:深入探索 sync.Map 及其他实现方法

在 Go 语言的并发编程世界中,数据共享和同步是永恒的话题。map 是 Go 语言中常用的数据结构,但在多 goroutine 环境中直接使用它并不是线程安全的。因此,我们需要采用特定的策略来确保并发访问的安全性。本文将深入探讨 Go 中的并发 Map&…

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…

Design Linear Filters in the Frequency Domain (MATLAB帮助文档)

Design Linear Filters in the Frequency Domain 这个帮助文档写得很好,简单明了,一句废话没有。 This topic describes functions that perform filtering in the frequency domain. 2-D Finite Impulse Response (FIR) Filters The Image Processi…

HTML 元素类型介绍

目录 1. 块级元素(Block-level Elements) 2. 行级元素(Inline Elements) 3. 行内块级元素(Inline-block Elements) 4. 表格相关元素 5. 列表相关元素 6. 表单相关元素 示例代码 示例效果 ​编辑 …

医疗数据质量安全,数据安全解决方案,医院关心的数据安全问题,信息安全方案(Word原件)

一、 数据安全背景 二、 风险分析 三、 解决方案 3.1方案设计 3.2敏感数据分类分级 3.4数据安全防御体系 3.4.1访问控制防护 3.4.2网络可信接入 3.4.3应用身份识别 3.4.4抵御SQL注入 3.4.5虚拟补丁防护 3.4.6阻断漏洞攻击 3.4.7权限细粒度管理 3.5规范数据运维管理…

华为昇腾 acl_pytorch

目录 sam部署教程: segment-anyghing地址: sam onnx地址: 报错: encode继续报错: sam部署教程: Ascend/ModelZoo-PyTorch - Gitee.com segment-anyghing地址: https://github.com/visher…

如何在 Ubuntu 22 04 上安装和配置 Ansible 自动化平台

如何在 Ubuntu 22.04 上安装和配置 Ansible 自动化平台 简介 Ansible 是一个开源项目,并在 Github 上收获了 63k 的 star 。它是一个极其简单的 IT 自动化平台,使您的应用程序和系统更易于部署和维护。使用 SSH,以接近简单英语的语言实现从…

C#中面试的常见问题003

1.委托的定义 定义委托 委托可以被视为一个指向方法的引用。你可以定义一个委托类型&#xff0c;该类型指定了方法的签名&#xff08;即方法的参数列表和返回类型&#xff09;。以下是定义委托的基本语法&#xff1a; public delegate int Comparison<T>(T x, T y); …