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

devtools/2024/11/15 4:21:33/

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

优点:

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

缺点:

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

适用场景:

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

代码示例:

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/devtools/8105.html

相关文章

如何用JS校验HTTP和HTTPS地址

在日常开发过程中,我们有时候对某些应用功能进行封装,但是在请求接口又不能写死,这个时候我们需要对他进行多方面考虑。 如何验证请求地址是HTTP还是HTTPS 方法一: function getBaseUrl (string) {let url;try {url new URL(s…

C#字典底层原理

一:前言 Dictionary是一种键值对的形式存放数据,即 key和value一一映射。key的类型没有限制,可以是整数、字符串甚至是实例对象 C#字典源码 时间复杂度 ——Add:O(1) ——Remove:一般情况下为O(1),最差情…

【opencv】dnn示例-person_reid.cpp 人员识别(ReID,Re-Identification)系统

ReID(Re-Identification,即对摄像机视野外的人进行再识别) 0030_c1_f0056923.jpg 0042_c5_f0068994.jpg 0056_c8_f0017063.jpg 以上为输出结果:result文件夹下 galleryLIst.txt queryList.txt 模型下载: https://github.com/ReID-Team/ReID_e…

VUE识别图片文字OCR(tesseract.js)

效果:1&#xff1a; 效果图2&#xff1a; 一、安装tesseract.js npm i tesseract.js 二、静态页面实现 <template><div><div style"marginTop:100px"><input change"handleChage" type"file" id"image-input"…

Spring Boot与JdbcTemplate:构建MySQL数据库应用的简易指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

SpringBoot 操作 Redis

导入对应版本的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>修改配置文件中的信息 spring:redis:host: 127.0.0.1port: 8888注意: 我这里 xsh…

经典机器学习算法——决策树

优质博文&#xff1a;IT-BLOG-CN 树模型是机器学习中最常用的一类模型&#xff0c;包括随机森林、AdaBoost、GBDT&#xff08;XGBoost和Lightgbm&#xff09;等&#xff0c;基本原理都是通过集成弱学习器的即式来进一步提升准确度。这里的弱学习器包括线性模型和决策树模型&…

Vue 3 Hooks:优雅管理组件状态的完整指南

一、介绍 Hooks是Vue 3中的特性&#xff0c;允许在函数组件中使用状态和其他React的逻辑。本教程将演示如何使用TypeScript和Hooks管理Vue 3组件的状态和生命周期。 二、创建Hooks 首先&#xff0c;创建一个hooks.ts文件&#xff0c;包含自定义hooks。 import { ref, onMou…