.NET 设计模式—建造者模式(Builder Pattern)

news2025/1/20 10:58:36

简介

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

建造者模式的核心思想就是将一个复杂对象的构建与其表示分离,让用户只需要关注需要构造的对象的属性即可。这样用户不需要知道对象的内部实现细节,只需要通过Builder提供的接口方法来设置对象属性,就可以得到一个完整的对象。

建造者( Builder )模式包含如下角色:

  • 抽象建造者类(Builder):这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。
  • 具体建造者类(ConcreteBuilder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。
  • 产品类(Product):要创建的复杂对象。
  • 指挥者类(Director):调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。

优点

  • 建造者独立,易扩展。
  • 便于控制细节风险。

缺点

  • 产品必须有共同点,范围有限制。
  • 如内部变化复杂,会有很多的建造类。

应用场景

  • 需要生成的对象具有复杂的内部结构。
  • 需要生成的对象内部属性本身相互依赖。

实现

案例:一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU、主板、硬盘、显卡、机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了。然而现实生活中也是如此的,如果公司要采购一批电脑,此时采购员不可能自己去买各个组件并把它们组织起来,此时采购员只需要像电脑城的老板说自己要采购什么样的电脑就可以了,电脑城老板自然会把组装好的电脑送到公司。

  • 抽象建造者:抽象建造者为创建复杂产品对象的各个部分指定抽象创建接口
/// <summary>
/// 抽象制造者-电脑中各个硬件部分的抽象接口
/// </summary>
public abstract class Builder
{
    /// <summary>
    /// CPU抽象创建
    /// </summary>
    public abstract void CreateCpu();

    /// <summary>
    /// 主板抽象创建
    /// </summary>
    public abstract void CreateMotherboard();

    /// <summary>
    /// 显卡抽象创建
    /// </summary>
    public abstract void CreateGraphicsCard();

    /// <summary>
    /// 获取组装好的电脑信息
    /// </summary>
    /// <returns></returns>
    public abstract Computer GetComputer();
}
  • 具体建造者:继承抽象建造者,实现抽象创建接口。指定创建的类型。创建各个具体的部分。
/// <summary>
/// 具体产品创建者-联想电脑各个硬件部分实现接口
/// </summary>
public class LenovoBuilder : Builder
{
    Computer computer = new Computer(ComputerType.Lenovo);
    public override void CreateCpu()
    {
        computer.Add("联想CPU");
    }

    public override void CreateGraphicsCard()
    {
        computer.Add("联想主板");
    }

    public override void CreateMotherboard()
    {
        computer.Add("联想显卡");
    }

    public override Computer GetComputer()
    {
        return computer;
    }
}

/// <summary>
/// 具体产品创建者-华为电脑各个硬件部分实现接口
/// </summary>
public class HuaweiBuilder : Builder
{
    Computer computer = new Computer(ComputerType.Huawei);
    public override void CreateCpu()
    {
        computer.Add("华为CPU");
    }

    public override void CreateGraphicsCard()
    {
        computer.Add("华为主板");
    }

    public override void CreateMotherboard()
    {
        computer.Add("华为显卡");
    }

    public override Computer GetComputer()
    {
        return computer;
    }
}

/// <summary>
/// 具体产品创建者-小米电脑各个硬件部分实现接口
/// </summary>
public class XiaomiBuilder : Builder
{
    Computer computer = new Computer(ComputerType.Xiaomi);
    public override void CreateCpu()
    {
        computer.Add("小米CPU");
    }

    public override void CreateGraphicsCard()
    {
        computer.Add("小米主板");
    }

    public override void CreateMotherboard()
    {
        computer.Add("小米显卡");
    }

    public override Computer GetComputer()
    {
        return computer;
    }
}
  • 产品角色:复杂产品对象,将各个部分组成产品的接口
/// <summary>
/// 产品角色:电脑的组装
/// </summary>
public class Computer
{
    private ComputerType _type;
    public Computer(ComputerType type)
    {
        _type = type;
    }

    //电脑配件组装
    private List<string> computerParts = new List<string>();
    public void Add(string computerPart)
    {
        computerParts.Add(computerPart);
    }

    /// <summary>
    /// 展示组装过程
    /// 
    /// </summary>
    public void Show()
    {
        Console.WriteLine($"电脑组装正式开始!");
        foreach (string computerPart in computerParts)
        {
            Console.WriteLine($"配件:{computerPart} 已装好!");
        }
        Console.WriteLine("电脑组成完成了!");
    }
}

public enum ComputerType : int
{
    [Description("华为")]
    Huawei = 0,
    [Description("联想")]
    Lenovo = 1,
    [Description("小米")]
    Xiaomi = 2,
}
  • 指挥者:调用各个部分,按固定的算法创建。不涉及到具体产品类的信息。仅负责各个部分完整的创建
/// <summary>
/// 指挥者(导演)-固定组装算法
/// </summary>
public class Commander
{
    public void Construct(Builder builder)
    {
        builder.CreateMotherboard();
        builder.CreateGraphicsCard();
        builder.CreateCpu();
    }
}
  • 上层应用演示调用
{
    #region 组装联想电脑

    //实例化指挥者
    Commander commander = new Commander();
    //指定具体产品
    Builder builder = new LenovoBuilder();
    //组装构建产品
    commander.Construct(builder);
    //展示产品
    Computer computer = builder.GetComputer();
    computer.Show();

    #endregion
}

{
    #region 组装华为电脑

    //实例化指挥者
    Commander commander = new Commander();
    //指定具体产品
    Builder builder = new HuaweiBuilder();
    //组装构建产品
    commander.Construct(builder);
    //展示产品
    Computer computer = builder.GetComputer();
    computer.Show();

    #endregion
}

{
    #region 组装小米电脑

    //实例化指挥者
    Commander commander = new Commander();
    //指定具体产品
    Builder builder = new XiaomiBuilder();
    //组装构建产品
    commander.Construct(builder);
    //展示产品
    Computer computer = builder.GetComputer();
    computer.Show();

    #endregion
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SCI绘图】【曲线图系列2 python】多类别标签对比的曲线图

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【曲线图系列2 python】多类别标签对比的曲线图&#xff0c;文末附完整代码。 1.环境准备 python 3 import proplot as pp…

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--创建新主题

前言 你可以在wordpress里面下载使用人家打包好的主题&#xff0c;但可能不是很好用&#xff0c;接下来就自己做一个自己的主题。你需要先找到xampp文件夹–htdocs–wordpress(我给更名为wplocal)–wp-content–themes 进入该文件夹之后你可以看到你之前下载导入的所有主题文件…

多态.Java

&#xff08;1&#xff09;什么是多态&#xff1f; 同类型的对象&#xff0c;表现出不同的形态。前者指父类&#xff0c;后者指不同的子类 说简单点&#xff0c;就是父类的同一种方法&#xff0c;可以在不同子类中表现出不同的状态&#xff0c;或者说在不同子类中可以实现不同…

【嵌入式硬件】三极管伏安特性曲线-饱和区

1.三极管伏安特性 三极管工作电路如下图所示。 三极管伏安特性曲线 书本上的描述: 截止区:三极管工作在截止状态,当发射结的电压Ube 小于 导通电压(0.6V-0.7V),发射结没有导通;集电结处于反向偏置,没有放大作用。 放大区:三极管的发射极加正向电压(…

[机器学习]人工智能为小米智架保驾护航

前言 小米汽车作为小米集团进军汽车行业的新尝试&#xff0c;吸引了广泛的关注。其结合了小米在科技和创新方面的优势&#xff0c;以及对智能出行的愿景&#xff0c;为汽车行业注入了新的活力。虽然小米汽车工厂还处于初期阶段&#xff0c;但其积极采用人工智能和机器学习等前沿…

Day84:服务攻防-端口协议桌面应用QQWPS等RCEhydra口令猜解未授权检测

目录 端口协议-口令爆破&未授权 弱口令爆破 FTP&#xff1a;文件传输协议 RDP&#xff1a;Windows远程桌面协议 SSH&#xff1a;Linux安全外壳协议 未授权案例(rsync) 桌面应用-QQ&WPS&Clash QQ RCE 漏洞复现 WPS RCE 漏洞复现 Clas* RCE 漏洞复现 知识点…

非关系型数据库--------------------Redis 群集模式

目录 一、集群原理 二、集群的作用 &#xff08;1&#xff09;数据分区 &#xff08;2&#xff09;高可用 Redis集群的作用和优势 三、Redis集群的数据分片 四、Redis集群的工作原理 五、搭建redis群集模式 5.1启用脚本配置集群 5.2修改集群配置 5.3启动redis节点 5…

AcWing 312. 乌龟棋(每日一题)

原题链接&#xff1a;312. 乌龟棋 - AcWing题库 小明过生日的时候&#xff0c;爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘只有一行&#xff0c;该行有 N 个格子&#xff0c;每个格子上一个分数&#xff08;非负整数&#xff09;。 棋盘第 1 格是唯一的起点&#xff0c;第…

如何使用 Midjourney?2024年最新更新

一&#xff1a;基础篇 1&#xff1a;注册 首先&#xff0c;你需要注册一个 Discord 账号&#xff0c;然后加入 Midjourney 的 Discord 服务器。或者去 Midjourney 的官网点击右下角的 Join the Beta&#xff1a; ​ 2&#xff1a;在 Discord 公共服务器里使用 注册并进入到…

信息系统项目管理师——第20章高级项目管理

本章是将第三版的第20章、第21章、第18章、第25章、第2章的PRINCE2进行了合并&#xff0c;精简和新增了部分知识。选择、案例都会考。从2023年上半年考情来看 选择题&#xff0c;考3-4分&#xff0c;基本是课本原话&#xff0c;但是知识点比较分散&#xff0c;需要多刷题&#…

某盾滑块拼图验证码增强版

介绍 提示&#xff1a;文章仅供交流学习&#xff0c;严禁用于非法用途&#xff0c;如有不当可联系本人删除 最近某盾新推出了&#xff0c;滑块拼图验证码&#xff0c;如下图所示&#xff0c;这篇文章介绍怎么识别滑块距离相关。 参数attrs 通过GET请求获取的参数attrs, 决…

矩阵空间秩1矩阵小世界图

文章目录 1. 矩阵空间2. 微分方程3. 秩为1的矩阵4. 图 1. 矩阵空间 我们以3X3的矩阵空间 M 为例来说明相关情况。目前矩阵空间M中只关心两类计算&#xff0c;矩阵加法和矩阵数乘。 对称矩阵-子空间-有6个3X3的对称矩阵&#xff0c;所以为6维矩阵空间上三角矩阵-子空间-有6个3…

【洛谷 P8655】[蓝桥杯 2017 国 B] 发现环 题解(邻接表+并查集+路径压缩)

[蓝桥杯 2017 国 B] 发现环 题目描述 小明的实验室有 N N N 台电脑&#xff0c;编号 1 ∼ N 1 \sim N 1∼N。原本这 N N N 台电脑之间有 N − 1 N-1 N−1 条数据链接相连&#xff0c;恰好构成一个树形网络。在树形网络上&#xff0c;任意两台电脑之间有唯一的路径相连。 …

设计模式总结-外观模式(门面模式)

外观模式 模式动机模式定义模式结构外观模式实例与解析实例一&#xff1a;电源总开关实例二&#xff1a;文件加密 模式动机 引入外观角色之后&#xff0c;用户只需要直接与外观角色交互&#xff0c;用户与子系统之间的复杂关系由外观角色来实现&#xff0c;从而降低了系统的耦…

【Canvas技法】用椭圆绘制经纬线

【图示】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>用椭圆绘制经纬线</title><style type"text/css"…

二叉树算法练习day.2

102.二叉树的层序遍历 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&a…

Peter算法小课堂—树状数组

大家好&#xff0c;我是人见人爱&#xff0c;花见花开&#xff0c;车见车爆胎的树状数组Peter Pan&#xff0c;hhh 讲正文前&#xff0c;先来一个长文警告⚠很重要的知识点&#xff1a;L SB&#xff08;SB&#xff1f;&#xff09; LSB 怎么算呢&#xff1f; 哦……懂了&…

班级事务管理系统设计与实现(论文+源码)_kaic

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对班级事务信息管理的提升&#…

在flutter中添加video_player【视频播放插件】

添加插件依赖 dependencies:video_player: ^2.8.3插件的用途 在Flutter框架中&#xff0c;video_player 插件是一个专门用于播放视频的插件。它允许开发者在Flutter应用中嵌入视频播放器&#xff0c;并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…

Linux| Awk 中“next”命令奇用

简介 本文[1]介绍了在Linux中使用Awk的next命令来跳过剩余的模式和表达式&#xff0c;读取下一行输入的方法。 next命令 在 Awk 系列教程中&#xff0c;本文要讲解如何使用 next 命令。这个命令能让 Awk 跳过所有你已经设置的其他模式和表达式&#xff0c;直接读取下一行数据。…