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实例。 - 在主机对象上调用
Run
或RunAsync
方法启动主机。
3. 注意要点
- Builder模式主要用于"分步骤构建一个复杂的象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
- 变化点在哪里,封装哪里 —— Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。缺点在于难以应对“分步骤构建算法”的需求变动。
- Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决"对象部分”的需求变化。Builder模式通常和Composite(组合模式)组合使用。