首页 > 编程语言 >Builder 生成器模式简介与 C# 示例【创建型2】【设计模式来了_2】

Builder 生成器模式简介与 C# 示例【创建型2】【设计模式来了_2】

时间:2023-12-27 20:24:47浏览次数:31  
标签:string 示例 对象 builder 生成器 OrderBuilder 设计模式 public

Builder 生成器模式简介与 C# 示例【创建型2】【设计模式来了_2】

 

阅读目录


回到顶部

〇、简介

1、什么是生成器模式?

一句话解释:

  在构造一个复杂的对象(参数多且有可空类型)时,通过一个统一的构造链路,可选择的配置所需属性值,灵活实现可复用的构造过程。

生成器模式的重心,在于分离构建算法具体的构造实现,从而使得构建算法可以重用采用不同的构建实现,产生不同的产品。所以生成器模式都会存在两个部分:整体构建算法、部件的构造和产品的装配。

官方意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

一个比喻:(班级与各科课代表)

  每个班级都需要各科课代表,选人条件也会有多个,比如单科成绩名列前茅、课堂表现活跃等,还有些非必要的条件,例如是否开朗等,根据这些条件就可以制定一个标准,对应的就是统一的 IBuilder 接口。不同的科目都可以实现这个接口去生成自己的课代表。

2、优缺点和使用场景

优点:

  • 客户端不必知道目标对象内部组成的细节,目标对象本身与目标对象的创建过程解耦,使得相同的创建过程可以创建不同的目标对象;
  • 具体创建者可被扩展;
  • 更加精细化的操控目标对象的生成过程,根据生成器提供的步骤逐步构建,可以精细化的控制到产品的内部。

缺点:

  • 目标对象有很多共同特定,不同的目标对象组成类似,差异不是很多。

适用场景:

  • 当创建复杂对象的算法,应该独立于该对象的组成部分,以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

简言之:当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

回到顶部

一、简单的示例代码

 如下示例,通过生成器创建一个订单:

  // 测试一下
  public class Program
  {
  static void Main(string[] args)
  {
  OrderBuilder builder = new OrderBuilder();
  OrderDirector director = new OrderDirector(builder);
  object order = director.Construct("John Doe", "Product ABC", 2, 10.99m);
  Console.WriteLine(order.ToString());
  Console.ReadLine();
  }
  }
  // 订单类
  public class Order
  {
  public string CustomerName { get; set; }
  public string ProductName { get; set; }
  public int Quantity { get; set; }
  public decimal TotalPrice { get; set; }
  public override string ToString() // 重写 ToString() 定义输出格式
  {
  return $"Customer: {CustomerName}\nProduct: {ProductName}\nQuantity: {Quantity}\nTotal Price: {TotalPrice}";
  }
  }
  // 生成器接口
  public interface IBuilder
  {
  OrderBuilder SetCustomer(string customerName);
  OrderBuilder AddProduct(string productName, int quantity, decimal price);
  Order Build();
  }
  // 订单生成器,实现接口 IBuilder
  public class OrderBuilder : IBuilder
  {
  private Order order;
  public OrderBuilder()
  {
  order = new Order();
  }
  public OrderBuilder SetCustomer(string customerName)
  {
  order.CustomerName = customerName;
  return this;
  }
  public OrderBuilder AddProduct(string productName, int quantity, decimal price)
  {
  order.ProductName = productName;
  order.Quantity = quantity;
  order.TotalPrice = quantity * price;
  return this;
  }
  public Order Build() // 最后返回创建的 Order 对象
  {
  return order;
  }
  }
  // 订单导向器,完成具体的构建步骤
  public class OrderDirector
  {
  private IBuilder builder;
  public OrderDirector(IBuilder builder)
  {
  this.builder = builder;
  }
  public Order Construct(string customerName, string productName, int quantity, decimal price)
  {
  builder.SetCustomer(customerName)
  .AddProduct(productName, quantity, price);
  return builder.Build();
  }
  }

结果输出:

  

再试着扩展一下:(这里简单举个例子,线上和线下订单区别在是否有购买者用户名)

点击展开示例代码 线上线下订单生成
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

结果输出:

  

回到顶部

二、生成器模式结构

根据上一章节的示例代码,简单画一个 UML 图,如下:

IBuilder:为创建一个 Order 对象的各个信息而指定抽象接口。

OrderBuilder:实现 IBuilder 的接口以构造和装配该订单的各个部件;定义并明确它所创建的表示;提供一个获取订单的接口。

OrderDirector:构造一个使用 IBuilder 接口的对象。

Order:表示被构造的复杂对象。OrderBuilder 创建该订单的内部表示并定义它的装配过程。包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

回到顶部

三、在 .Net 框架中的实际应用

例如在 WebAPI 项目中的 Program.cs 文件中的主方法 Main(),CreateHostBuilder(args).Build().Run()在 WebHost 构建时采用了生成器模式。

  public class Program
  {
  public static void Main(string[] args)
  {
  CreateHostBuilder(args).Build().Run();
  }
   
  public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
  .ConfigureWebHostDefaults(webBuilder =>
  {
  webBuilder.UseStartup<Startup>();
  });
  }

 其生成器接口定义如下,其中 Configure 系列的配置方法均返回构建器接口类,以便在构建时,可以方便的对配置进行连续配置,这也是链式调用的经典场景之一。例如,构建时可以使用CreateHostBuilder(args).ConfigureAppConfiguration(a=>a.builder()).ConfigureServices((builder,s)=>s.register()).Build();,这样感觉像一个流水线机器一样,逐步构建完毕各个部分,最后生成出预制件。

  // Microsoft.Extensions.Hosting.Abstractions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
  // Microsoft.Extensions.Hosting.IHostBuilder
  using System;
  using System.Collections.Generic;
  using Microsoft.Extensions.Configuration;
  using Microsoft.Extensions.DependencyInjection;
  using Microsoft.Extensions.Hosting;
   
  public interface IHostBuilder
  {
  IDictionary<object, object> Properties { get; }
   
  IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate);
   
  IHostBuilder ConfigureAppConfiguration(Action<HostBuilderContext, IConfigurationBuilder> configureDelegate);
   
  IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate);
   
  IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory);
   
  IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Func<HostBuilderContext, IServiceProviderFactory<TContainerBuilder>> factory);
   
  IHostBuilder ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext, TContainerBuilder> configureDelegate);
   
  IHost Build();
  }
回到顶部

四、相关模式

AbstractFactory 与 Builder 相似,因为它也可以创建复杂对象。主要区别是 Builder 模式侧重于一步步构造一个复杂的对象,而 AbstractFactory 侧重于多个系列的产品对象(简单或复杂的)。Builder 在最后一步返回产品,而 AbstractFactory 产品时立即返回的。

另外,Composite 组合模式是用 Builder 生成的。

参考: https://www.cnblogs.com/zhuYears/archive /2012/05/25/2518008.html  https://www.cnblogs.com/gaochundong/p/design_pattern_builder.html  https://juejin.cn/post/6991323757335805960             

本文来自博客园,作者:橙子家,微信号:zfy1070491745,有任何疑问欢迎沟通,一起成长! 您的支持,博主的动力!

标签:string,示例,对象,builder,生成器,OrderBuilder,设计模式,public
From: https://www.cnblogs.com/sexintercourse/p/17931345.html

相关文章

  • Decorator 装饰者模式简介与 C# 示例【结构型4】【设计模式来了_9】
    Decorator装饰者模式简介与C#示例【结构型4】【设计模式来了_9】 阅读目录〇、简介1、什么是装饰者模式2、优缺点和适用场景一、通过示例代码简单实现二、装饰者模式的结构三、相关模式回到顶部〇、简介1、什么是装饰者模式一句话解释:  通过继承统......
  • openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作
    openGauss学习笔记-175openGauss数据库运维-备份与恢复-导入数据-管理并发写入操作示例本章节以表test为例,分别介绍相同表的INSERT和DELETE并发,相同表的并发INSERT,相同表的并发UPDATE,以及数据导入和查询的并发的执行详情。CREATETABLEtest(idint,namechar(50),addressva......
  • Java 工厂方法设计模式
    需求:Pizza有以下几个方法prepare()准备食材bake()烘焙cut()切割box()装盒现在有2种披萨且和2地区有关,成都地区第一种是CDApplePizza,第二种是CDCheesePizza。北京地区的BJApplePizza和BJApplePizza。PizzaStore有点单系统Order(city,pizzaType)根据pizzatype去制作对......
  • flutter常用的设计模式
    单例模式(SingletonPattern):确保一个类只有一个实例,并提供一个全局访问点。工厂模式(FactoryPattern):定义一个创建对象的接口,但让子类决定具体实例化哪个类;常用于创建组件、复杂对象等场景。抽象工厂模式(AbstractFactoryPattern):提供一个创建一系列相关或相互依赖对象的接口,而......
  • JAVA 设计模式(一) - 单例模式
    JAVA设计模式(一)-单例模式本篇文章主要讲下android创建型设计模式中的单例模式.单例模式保证一个类只有一个实例,并提供一个访问该实例的全局节点.它的实现有多种实现方式:1:饿汉式饿汉式:类加载时就创建实例.不支持延迟加载实例publicclassSingleton{priva......
  • JAVA设计模式(三)-原型
    JAVA设计模式(三)-原型本篇文章主要讲下java创建型设计模式中的原型模式.何谓原型模式:简单来说就是将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。使用原型模式,就可以简化实例化的过程,不必依赖于构造函数或者new关键字.由于java提供了clone方法......
  • JAVA设计模式(二)-简单工厂
    JAVA设计模式(二)-简单工厂本篇文章主要讲下java创建型设计模式中的简单工厂模式.简单工厂模式又叫静态工厂方法模式(StaticFactoryMethodPattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。1:定义接口publicinterfacePeople{v......
  • JWT 简介与 C# 示例
    〇、什么是JWT?JWT,即JSONWebToken,是一种基于JSON的开放标准(RFC7519),主要用于在网络应用环境间安全地传递声明。这种声明被进行了数字签名,可以验证和信任,因此,它适用于各种需要信息安全性和无状态的应用。在具体加密过程中,客户端会使用RSA算法生成JWT串,这里用到了私钥“......
  • 设计模式 之适配器模式
    适配器模式(适配器模式)定义==适配器模式==将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者。这种做法还有额外的优点,那就是被适配者的任何子类都可以搭配着适配器......
  • 代码生成器20231218
      生成器 ......