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

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

优点:

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

缺点:

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

适用场景:

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

代码示例:

csharp 复制代码
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();
    }
}
相关推荐
其实防守也摸鱼18 分钟前
推荐一个自动化教育SRC漏洞挖掘系统--AutoHunter
运维·开发语言·人工智能·学习·安全·web安全·自动化
kkkkkkkkkk_Z7 小时前
学嵌入式和C语言编程数据结构|学习日记Day22:栈,二叉树,哈希存储
c语言·数据结构·学习
for_ever_love__9 小时前
python基础语法学习: 闭包
开发语言·python·学习·闭包
皮卡丘不断更11 小时前
从遥操作示范到可复现训练:LeRobot 0.6.1 的机器人学习工作流
人工智能·学习·机器人·开源·开发工具
IZero0711 小时前
Elasticsearch 学习笔记筑基-文档操作篇
笔记·学习·elasticsearch
小白说大模型12 小时前
AI驱动的个性化学习路径:知识图谱与知识点关联的存储与推理
大数据·人工智能·学习·mysql·机器学习·prompt·知识图谱
吃好睡好便好13 小时前
三伏天结束了
学习·生活·毕淑敏·心理游戏
2501_9318197013 小时前
方言标注标准化模板迭代优化诉求 泸州话标注公司学习信实翻译模板迭代方法论
学习
tju新生代魔迷14 小时前
Python学习日记5
学习
小唔w15 小时前
武汉外籍人员子女学校择校观察:枫叶教育信息整理
学习