C#设计模式之建造者模式生成器模式示例详解

目录
  • 前言
  • 建造者模式结构
    • 实例
      • 使用建造者模式
  • 总结

前言

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

建造者模式结构

主要由四个核心角色组建而成分别为

  • 生成器(Builder):抽象产品生产步骤的方法。
  • 具体生成器(Concrete Builders):产品生产步骤方法的不同的具体实现。
  • 产品(Products):最终生成的对象。
  • 主管:(Director) 类定义调用构造步骤的顺序, 这样你就可以创建和复用特定的产品配置。

结构类图

实例

使用建造者模式的时候,我们应该先问问为什么要使用它?使用它能给我们带来什么?当你考虑足够了,使用起来才会更加顺畅。下面会讲解一些实例来代入我是如何理解的,也希望能帮助大家更好的理解建造者模式!

电脑在我们日常生活中是非常常见的,它的核心组成是什么呢?CPU、主板、电源、内存、硬盘等等,那么客户端需要我们构造出来一台电脑,我们应该如何实现呢?

static void Main(string[] args)
{
    Computer computer = new Computer();
    computer.SetCpu("cpu");
    computer.SetMainboard("主板");
    computer.SetPowerSupply("电源");
    computer.SetGraphicsCard("集成显卡");
    computer.GetComputerInfo();
    Console.ReadLine();
}
public class Computer
{
    private string _cpu;
    private string _mainboard;
    private string _powerSupply;
    private string _graphicsCard;
    public void SetCpu(string cup)
    {
        _cpu = cup;
    }
    public void SetMainboard(string mainboard)
    {
        _mainboard = mainboard;
    }
    public void SetPowerSupply(string powerSupply)
    {
        _powerSupply = powerSupply;
    }
    public void SetGraphicsCard(string graphicsCard)
    {
        _graphicsCard = graphicsCard;
    }
    public void GetComputerInfo()
    {
        Console.WriteLine($"电脑配置为Cpu:{_cpu},主板为:{_mainboard},电源为:{_powerSupply},显卡为:{_graphicsCard}");
    }
}

大家都知道电脑有固态硬盘和机械硬盘之分,当然需求也各异,毕竟现在显卡偏贵,有大多数人选择机械硬盘,有些爱玩游戏的就需要固态硬盘,针对需求我们在构建电脑过程也会产生差异。

对于用户来说他只需要知道他要的东西(如带固态硬盘电脑或者机械硬盘电脑),至于你的构建过程用户也不会太在乎。

在上述例子中客户需要手动去Set,如果需要Set的值过多,可能会导致用户一些关键属性少赋值,并且顺序也是由用户控制的,在某些环节出现问题,就会导致电脑组装不起来。

针对上述问题,我们可以很容易的代入建造者模式,它能将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示!

使用建造者模式

通过上面一些表述,在构建产品过程中是稳定的,而具体的构造细节是不一样的有的需要固态硬盘,有的要机械硬盘等,那我们如何使用建造者模式呢?

// 建造者核心角色生成器
public interface IComputerBuilder
{
    void SetCpu(string cup);
    void SetMainboard(string mainboard);
    void SetPowerSupply(string powerSupply);
    void SetIsGraphicsCard(string graphicsCard);
}
// A电脑具体生成器(固态硬盘电脑)
public class AComputerBuilder : IComputerBuilder
{
    private Computer Computer;
    public AComputerBuilder()
    {
        Computer = new Computer();
    }
    public Computer GetComputer()
    {
       return Computer;
    }
    public void SetCpu() => Computer.Cpu = "CPU";
    public void SetHardDisk() => Computer.HardDisk = "固态硬盘";
    public void SetMainboard() => Computer.Mainboard = "主板";
    public void SetPowerSupply() => Computer.PowerSupply = "电源";
}
// A电脑具体生成器(机械硬盘电脑)
public class BComputerBuilder : IComputerBuilder
{
    private Computer Computer;
    public BComputerBuilder()
    {
        Computer = new Computer();
    }
    public Computer GetComputer()
    {
        return Computer;
    }
    public void SetCpu() => Computer.Cpu = "CPU";
    public void SetHardDisk() => Computer.HardDisk = "机械硬盘";
    public void SetMainboard() => Computer.Mainboard = "主板";
    public void SetPowerSupply() => Computer.PowerSupply = "电源";
}
  • 通过了解建造者模式结构,我们需要引入主管(Director)概念类定义调用构造步骤的顺序。
public class Director
{
    private IComputerBuilder ComputerBuilder;
    //客户端代码会创建生成器对象并将其传递给主管,然后执行构造过程。
    public Director(IComputerBuilder _ComputerBuilder)
    {
        ComputerBuilder = _ComputerBuilder;
    }
    public Computer Build()
    {
        ComputerBuilder.SetCpu();
        ComputerBuilder.SetMainboard();
        ComputerBuilder.SetPowerSupply();
        ComputerBuilder.SetHardDisk();
        return ComputerBuilder.GetComputer();
    }
}
  • 执行结果

总结

使用建造者模式,可以将项目中复杂的构建逻辑提取出来,并且可以分布构建。电脑这个产品的组成是一些固定的硬件,变得只是这些具体的硬件,比如需要构建500W电源的电脑亦或者是750W的电脑,只需要继承IComputerBuilder实现即可(可扩展性)。

但是如果内部复杂,可能会产生非常多的建造者类,无疑会产生非常多的类,代码复杂度提高了。注意: 当具体建造者只有一个的时候,主管(Director)完全可以省略掉。

以上就是C#设计模式之建造者模式生成器模式示例详解的详细内容,更多关于C#设计模式建造者模式的资料请关注我们其它相关文章!

(0)

相关推荐

  • 深入了解C#设计模式之订阅发布模式

    什么是Pub-Sub 发布订阅是一种设计模式,它允许应用程序组件之间进行松散耦合. 其实订阅发布设计中主要是发布者生成事件通道,用于在不了解任何订阅者存在的情况下通知订阅者. 当然委托EventHandlers和Event关键字在此事件处理机制中担任着重要的角色.下面我们来看看如何使用它们. Pub和Sub的使用 首先我们看一个简单地订阅发布模式. 定义一个Action委托,无返回值. namespace PubSubPattern { public class Pub { public Act

  • C#设计模式实现之迭代器模式

    目录 前言: 一.餐馆合并菜单 二.改进菜单实现 三.迭代器模式 总结 前言: 迭代器模式平时用的不多,因为不管C#还是Java都已经帮我封装了,但是你是否知道平时经常在用的东西本质是怎么回事呢. 看完迭代器模式你就知道C# foreach循环是怎么实现的了,我的另一篇C# Foreach循环本质与枚举器就讲解了foreach的本质,其中用到的就是迭代器模式. 按照惯例,例子走起.(写了几个小时浏览器崩溃,我看见在自动保存啊,结果没内容,再撸一遍精简点的吧) 一.餐馆合并菜单 现在有两个餐馆和并

  • C#设计模式之职责链模式示例详解

    前言 在软件开发中,我们通常会遇到一种场景,比如某个请求,会依次经过系统中的很多个模块来处理,如果某个模块处理不了,则将请求传递给下一个模块,比如在订单处理中,首先要经过用户校验,商品库存充足校验,如果不满足条件,返回错误,如果满足条件才会到下一步处理. 在ASP.NET Core里有middleware中间键的概念,每一个请求进来,都会经过一系列的Handler,这是一种职责链模式,每一个Handler都会决定是否处理该请求,以及是否决定将该请求传递给一下请求继续处理. 在.NET的委托中,也

  • C#面向对象的23种设计模式介绍

    目录 一.设计模式概述 二.面向对象23种设计模式 创建型模式 结构型模式 行为型模式 三.设计模式六大原则详细解析 四.源码仓库 一.设计模式概述 设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.程序的重用性. 设计模式其实就是开发过程中常见问题的解决方案,是解决问题的思路.学习设计模式能更优雅的解决面向对程序开发设计问题. 二.面向对象23种设计模式 创建型模式 关注对象的创建 模式名称 中文

  • .Net设计模式之建造者、生成器模式(Builder)

    一.动机(Motivation) 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定.如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变? 二.意图(Intent) 将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.——<设计模式>GoF 三.结构(

  • JavaScript设计模式之原型模式和适配器模式示例详解

    目录 原型模式 原型模式介绍 代码实现 适配器模式 适配器模式介绍 代码实现 小结 原型模式 原型模式介绍 原型模式是指原型实例指向创建对象的种类,并通过拷贝这些原型创建新的对象,是一种用来创建对象的模式,也就是创建一个对象作为另一个对象的prototype属性 实现原型模式是在ECMAScript5中,提出的Object.create方法,使用现有的对象来提供新创建的对象的__proto__. 代码实现 var lynkCoPrototype = { model: "领克", get

  • Golang设计模式工厂模式实战写法示例详解

    目录 拆出主板 工厂模式流程 代码实战 抽象能力,定义接口 实现工厂,支持注册和获取实现 主流程只依赖接口完成 扩展 => 适配器,实现接口 注册适配器到工厂里 小结 拆出主板 今天带大家看一下怎么用 Go 写工厂模式的代码,我们来学习一个实战案例.这个写法笔者日常经常使用,能够很有效地帮助大家实现 Separation of Concerns. 主板就是一个程序的主流程.比如我们要基于一份学习资料来消化,吸收知识.我们可能有下面几步流程: 准备好笔记本: 打开资料: 阅读资料内容,思考并记录关

  • React路由拦截模式及withRouter示例详解

    目录 一.路由拦截 二.路由模式 三.withRouter 一.路由拦截 在前面两篇 路由博客基础上,我们将ReactRouter.js的我的profile路由设置成路由拦截的: <Route path="/profile" render={() => isAuth() ? <Profile/> : <Redirect to="/login"></Redirect> }></Route> 新建Logi

  • 利用Python创建位置生成器的示例详解

    目录 介绍 开始 步骤 创建训练数据集 创建测试数据集 将合成图像转换回坐标 放在一起 结论 介绍 在这篇文章中,我们将探索如何在美国各地城市的地图数据和公共电动自行车订阅源上训练一个快速生成的对抗网络(GAN)模型. 然后,我们可以通过为包括东京在内的世界各地城市创建合成数据集来测试该模型的学习和概括能力. git clone https://github.com/gretelai/GAN-location-generator.git 在之前的一篇博客中,我们根据电子自行车订阅源中的精确位置数

  • C#设计模式之建造者模式生成器模式示例详解

    目录 前言 建造者模式结构 实例 使用建造者模式 总结 前言 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 建造者模式结构 主要由四个核心角色组建而成分别为 生成器(Builder):抽象产品生产步骤的方法. 具体生成器(Concrete Builders):产品生产步骤方法的不同的具体实现. 产品(Products):最终生成的对象. 主管:(Director) 类定义调用构造步骤

  • Java设计模式之建造者模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 建造者模式的优势: 注意点 定义 建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象.建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可 以构建它们,用户不需要知道内部的具体构建细节. 案例 需求 女生每天化妆,假如只需要做发型,香水,衣服,并要求按照发型——>香水——>衣服的顺序进行,

  • Java结构型设计模式中建造者模式示例详解

    目录 建造者模式 概述 角色 优缺点 应用场景 基本使用 创建产品类 创建建造者类 使用 链式写法 创建产品类与建造者类 使用 建造者模式 概述 建造者模式(Builder Pattern)属于创建型模式. 它是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 简而言之:建造者模式就是使用多个简单的对象一步一步构建成一个复杂的对象. 建造者模式适用于创建对象需要很多步骤,但是步骤的顺序不一定固定.如果一个对象有非常复杂的内部结构(很多属性),可以将复杂对象的创建和使用进行分

  • Java设计模式之责任链模式的示例详解

    目录 应用场景 实际代码案例 无模式情况下的代码 采用责任链模式优化代码 采用建造者+责任链模式优化代码 责任链模式优缺点 责任链模式是将链中的每一个节点看做是一个对象,每个节点处理的请求均不相同,且内部自动维护下一个节点对象,当一个请求从链式的首段发出时,会沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求位置,属于行为模式. 这里需要注意的是每个节点都能对对象进行一定的处理(也可以不处理),处理完成之后节点再进行判断还要进行后续处理还是说传递给下一个节点. 应用场景 首先举一个日常

  • JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析

    本文实例讲述了JavaScript设计模式之构造器模式(生成器模式)定义与用法.分享给大家供大家参考,具体如下: 工厂模式虽然解决了重复实例化的问题,但无法识别对象类型. 可以采用构造函数(构造方法)可用来创建特定的对象,可以解决工厂模式无法识别对象实例的问题.也就是说,使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题. 构造器模式与工厂模式的不同之处在于: ① 构造函数方法没有显示的创建对象 (new Object()): ② 直接将属性和方法赋值给 this 对象:

随机推荐