.NET高级面试指南专题二十五【 建造者模式介绍,将复杂对象的构建过程与其表示分离】

embedded/2024/9/19 7:36:30/ 标签: 学习, 建造者模式, .net

建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它允许客户端通过指定要构建的类型和可选参数来构建对象,而不需要了解对象的具体构建细节。

优点:

  • 将构建过程封装在一个独立的构建者类中,使得客户端代码更加简洁和可读。
  • 可以轻松地构建不同表示的对象,因为客户端只需指定不同的构建者即可。
  • 提高了代码的灵活性,因为可以随时更改构建过程而不影响客户端。

缺点:

  • 增加了代码的复杂性,因为需要定义多个构建者类。
  • 如果产品类的属性较少或者变化不大,使用建造者模式可能会显得过度设计。

适用场景:

  • 当对象拥有复杂的构建过程,且需要将构建过程与表示分离时。
  • 当需要构建不同表示的同一类对象时。
  • 当对象的构建过程需要独立于其组装方式时。

代码示例:

using System;// 产品类
class Product
{public string Part1 { get; set; }public string Part2 { get; set; }public string Part3 { get; set; }public void Show(){Console.WriteLine($"Part1: {Part1}");Console.WriteLine($"Part2: {Part2}");Console.WriteLine($"Part3: {Part3}");}
}// 抽象建造者
interface IBuilder
{void BuildPart1();void BuildPart2();void BuildPart3();Product GetProduct();
}// 具体建造者A
class ConcreteBuilderA : IBuilder
{private Product product = new Product();public void BuildPart1(){product.Part1 = "Part A1";}public void BuildPart2(){product.Part2 = "Part A2";}public void BuildPart3(){product.Part3 = "Part A3";}public Product GetProduct(){return product;}
}// 具体建造者B
class ConcreteBuilderB : IBuilder
{private Product product = new Product();public void BuildPart1(){product.Part1 = "Part B1";}public void BuildPart2(){product.Part2 = "Part B2";}public void BuildPart3(){product.Part3 = "Part B3";}public Product GetProduct(){return product;}
}// 指挥者
class Director
{public void Construct(IBuilder builder){builder.BuildPart1();builder.BuildPart2();builder.BuildPart3();}
}class Program
{static void Main(string[] args){Director director = new Director();IBuilder builderA = new ConcreteBuilderA();director.Construct(builderA);Product productA = builderA.GetProduct();Console.WriteLine("Product A:");productA.Show();IBuilder builderB = new ConcreteBuilderB();director.Construct(builderB);Product productB = builderB.GetProduct();Console.WriteLine("\nProduct B:");productB.Show();}
}

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

相关文章

Android Jetpack学习系列——Room

关于Room: Room是Android Jetpack组件之一,旨在为Android应用程序提供一种简单、强大且易于使用的本地数据库访问解决方案。 关键特性: 1.基于SQLite封装:Room是基于SQLite数据库引擎构建的,提供了面向对象的API来与…

mysql基础4——增删改查表中的数据

添加数据 1)插入数据记录 insert into demo.test1 (barcode,goodsname,price) values (0001, book, 3); 2)插入查询结果 insert into table1 (字段名) select 字段名或值 from table2 where condition; //将表2中查询到的某条…

多端统一开发框架Taro、UniApp和WeApp这三个应用各自在前端开发领域有着独特的定位和功能

Taro、UniApp和WeApp这三个应用各自在前端开发领域有着独特的定位和功能,下面是对它们的详细介绍以及三者之间的对比,包括各自的优缺点和社区维护支持程度。 一、应用介绍 Taro Taro是一个多端统一开发框架,支持使用React语法编写一次代码…

ElasticSearch:基础操作

一、ES的概念及使用场景 ElasticSearch是一个分布式,高性能、高可用、可伸缩、RESTful 风格的搜索和数据分析引擎。通常作为Elastic Stack的核心来使用 我们通过将ES 和 mysql对比来更好的理解 ES,ES和mysql相关的基本概念的对比表格如下: …

RPC分布式通信框架

在实际开发中单机服务器存在诸多问题: 1.受限于硬件资源无法提高并发量 2.任意模块的修改都将导致整个项目代码重新编译部署 3.在系统中,有些模块属于CPU密集型,有些属于I/O密集型,各模块对于硬件资源的需求不一样 什么是分布式&a…

SQLite导出数据库至sql文件

SQLite是一款实现了自包含、无服务器、零配置、事务性SQL数据库引擎的软件库。SQLite是世界上部署最广泛的SQL数据库引擎。 SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。 SQLite 源代码不受版权限制。…

前端系列-2 模块化CommonJs+AMD+CMD+ES6

模块化 js中, 一个文件就是一个模块,模块化可以提高代码利用率而减少重复代码,将相同的逻辑维护在一个模块中,分而治之,提高代码的可维护性;另外,模块化的出现可以在工程中引入第三方模块,极大…

深入理解Java中的ConcurrentHashMap:原理与实践

文章目录 1. ConcurrentHashMap简介2. 分段锁原理3. CAS操作原理4. 扩容机制原理5. 近似计数原理6. 并发操作方法7. 遍历ConcurrentHashMap8. 扩展方法介绍9. 并发性能分析10. 局限性与适用场景11. 总结 本文详细解析了Java中线程安全的HashMap实现——ConcurrentHashMap的工作…

单片机自动称重灌装

//***********3KG电子称测试程序**HX711电路板***************** //******2013 6 8 05:38 L601 自动称重测试草稿 需硬件测试 /********-------------------------**********/ /*******|设定 00000 |***********************/ /*******|实际 00000 |***************…

解锁数据潜能:构建高效数据仓库的策略与实践

在数字化时代,数据已成为企业最宝贵的资产之一。然而,随着数据量的激增,企业面临着数据管理的诸多挑战。如何有效地利用这些数据,支持企业的决策和运营,成为每个企业都需要解答的问题。数据仓库的建设和数据的合理分层…

Stylus精讲:网页设计新境界【写作AI一键生成】

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

汽车笔记-保险

保险 1.交强险 上路必须买的, 国家规定必须要买。交强险不管你是有责还是无责,它都是可以赔偿的。交强险还有一个18000的垫付功能,比如说我们出了交通事故后,对方住院治疗需要你垫付钱,那么这个时候就可以用到交强险…

数据仓库、数据中台、大数据平台的关系?

一、数据中台 数据中台是一个数据运营的概念,主要功能是将跨领域的数据集中聚合和治理,将其抽象为服务,提供具有业务价值的逻辑概念。 相较于传统的大数据平台,数据中台是升级版的概念,并不再简单地将各个功能混在一起…

Docker搭建项目管理软件禅道

文章目录 一、简介二、部署三、使用 一、简介 禅道是以项目管理为核心的协作平台,旨在帮助团队高效地进行项目管理和协作。 禅道提供了项目管理、任务管理、团队协作、文档管理、报告统计等功能。 禅道官网 二、部署 操作系统:22.04.4 创建文件夹 …

支付宝支付前端如何显示

说来惭愧&#xff0c;自己后端兼修前端&#xff0c;已经碰到过几次这种问题&#xff0c;每次都没有记住&#xff0c;都要花时间在网上找答案&#xff0c;这次就把这个写出来。 前端只需要写一个 <iframe:srcdoc"alipayForm"frameborder"no"border"…

若依顶部导航栏Navbar一些个性化设置

删除部分默认工具栏 代码所在位置 src–>layout–>component–>Navbar.vue <div class"right-menu"><template v-if"device!mobile"> <!-- <search id"header-search" class"right-menu-item" /&g…

HarmonyOS NEXT 使用Canvas实现模拟时钟案例

介绍 本示例介绍利用 Canvas 和定时器实现模拟时钟场景&#xff0c;该案例多用于用户需要显示自定义模拟时钟的场景。 效果图预览 使用说明 无需任何操作&#xff0c;进入本案例页面后&#xff0c;所见即模拟时钟的展示。 使用说明 无需任何操作&#xff0c;进入本案例页…

Docker容器的使用与操作

1、什么是容器 镜像和容器的关系&#xff0c;就像是面向对象程序设计中的类和实例一样&#xff0c;镜像是静态的定义&#xff0c;容器是镜像运行时的实体&#xff0c;基于同一镜像可以创建若干个不同的容器。 每个容器都有一个软件镜像。可以将容器看作一个将应用程序及其依赖环…

C 练习实例13

C 练习实例13 - 水仙花数 题目&#xff1a; 打印出所有的"水仙花数"&#xff0c;所谓"水仙花数"是指一个三位数&#xff0c;其各位数字立方和等于该数 本身。例如&#xff1a;153是一个"水仙花数"&#xff0c;因为1531的三次方&#xff0b;5的三…

C# 多线程 未完

基本概念什么是线程为什么要多线程重复任务希望同时进行(比如对于数组中的每个元素都进行相同且耗时的操作)多个不同任务希望同时进行&#xff0c;互不干扰(比如有多个后台线程需要做轮询等操作) 什么是线程池一组预先创建的线程&#xff0c;可以被重复使用来执行多个任务异步编…