Builder生成器模式

>>返回《C#常用设计模式》

1. 简介

生成器模式把对象的创建步骤抽象成生成器,并且可以通过指导类(director)对所有生成步骤的先后顺序进行控制。客户端使用指导类并传入相应的生成器,通过指导类的接口便可以得到相应的对象。

适应于构建部分稳定不变,构建内容变动较频繁。将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

时序图

2. 示例

//使用的客户端类
public class Client
{
    public void Main()
    {
        //这里通过配置和反射 Assembly.Load  Activator.CreateInstance(Type) 实现
        House house= GameManager.CreateHouse(new RomainHouseBuilder());
    }
}

//相当于director
public class GameManager
{
    //该构建过程是相对稳定才能用此模式
    public static House CreateHouse(Builder builder)
    {
        builder.BuildWindows();
        builder.BuildWindows();
        builder.BuildDoor();
        builder.BuildWall();
        return builder.GetHouse();
    }
}

//抽象类的实现,当变动时将RomainHouseBuilder和RomainHouse换成新的
public class RomainHouse:House
{ }
public class RomainHouseBuilder : Builder
{
    public override void BuildWindows() { }
    public override void BuildDoor() { }
    public override void BuildWall() { }
}

//为了适应变化定义的抽象类
public abstract class House
{ }
public abstract class Builder
{
    public abstract void BuildWindows();
    public abstract void BuildDoor();
    public abstract void BuildWall();

    public abstract House GetHouse();
}

2.1. Dotnet框架中的示例

HostBuilder通用主机的设计使用的就是生成器模式。

public class Program
{
    public static void Main(string[] args)
    {
        //创建HostBuilder
        CreateHostBuilder(args)
            //构建成Host对象
            .Build()
            //启动Host对象
            .Run();
    }
    static IHostBuilder CreateHostBuilder(string[] args) =>
        //创建Builder
        Host.CreateDefaultBuilder(args)
            //配置设置
            .ConfigureAppConfiguration((hostingContext, configuration) =>
            {
                configuration.Sources.Clear();
                IHostEnvironment env = hostingContext.HostingEnvironment;
                configuration
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);
            })
            //DI设置
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
            //日志设置
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.AddConsole();
            });
}
  • 调用 CreateDefaultBuilder() 方法来创建和配置构建器对象。
  • 调用 Build() 创建一个IHost实例。
  • 在主机对象上调用 RunRunAsync 方法启动主机。

3. 注意要点

  1. Builder模式主要用于"分步骤构建一个复杂的象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
  2. 变化点在哪里,封装哪里 —— Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。缺点在于难以应对“分步骤构建算法”的需求变动。
  3. Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决"对象部分”的需求变化。Builder模式通常和Composite(组合模式)组合使用。
posted @ 2021-02-14 13:01  大师兄石头  阅读(340)  评论(0编辑  收藏  举报