生成器模式把对象的创建步骤抽象成生成器,并且可以通过指导类(director)对所有生成步骤的先后顺序进行控制。客户端使用指导类并传入相应的生成器,通过指导类的接口便可以得到相应的对象。
适应于构建部分稳定不变,构建内容变动较频繁。将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
时序图:
//使用的客户端类
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();
}
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实例。Run
或 RunAsync
方法启动主机。原文:https://www.cnblogs.com/BigBrotherStone/p/builder.html