经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Builder生成器模式
来源:cnblogs  作者:大师兄石头  时间:2021/2/18 15:34:51  对本文有异议

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

1. 简介

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

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

时序图

2. 示例

  1. //使用的客户端类
  2. public class Client
  3. {
  4. public void Main()
  5. {
  6. //这里通过配置和反射 Assembly.Load Activator.CreateInstance(Type) 实现
  7. House house= GameManager.CreateHouse(new RomainHouseBuilder());
  8. }
  9. }
  10. //相当于director
  11. public class GameManager
  12. {
  13. //该构建过程是相对稳定才能用此模式
  14. public static House CreateHouse(Builder builder)
  15. {
  16. builder.BuildWindows();
  17. builder.BuildWindows();
  18. builder.BuildDoor();
  19. builder.BuildWall();
  20. return builder.GetHouse();
  21. }
  22. }
  23. //抽象类的实现,当变动时将RomainHouseBuilder和RomainHouse换成新的
  24. public class RomainHouse:House
  25. { }
  26. public class RomainHouseBuilder : Builder
  27. {
  28. public override void BuildWindows() { }
  29. public override void BuildDoor() { }
  30. public override void BuildWall() { }
  31. }
  32. //为了适应变化定义的抽象类
  33. public abstract class House
  34. { }
  35. public abstract class Builder
  36. {
  37. public abstract void BuildWindows();
  38. public abstract void BuildDoor();
  39. public abstract void BuildWall();
  40. public abstract House GetHouse();
  41. }

2.1. Dotnet框架中的示例

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

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. //创建HostBuilder
  6. CreateHostBuilder(args)
  7. //构建成Host对象
  8. .Build()
  9. //启动Host对象
  10. .Run();
  11. }
  12. static IHostBuilder CreateHostBuilder(string[] args) =>
  13. //创建Builder
  14. Host.CreateDefaultBuilder(args)
  15. //配置设置
  16. .ConfigureAppConfiguration((hostingContext, configuration) =>
  17. {
  18. configuration.Sources.Clear();
  19. IHostEnvironment env = hostingContext.HostingEnvironment;
  20. configuration
  21. .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
  22. .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);
  23. })
  24. //DI设置
  25. .ConfigureServices((hostContext, services) =>
  26. {
  27. services.AddHostedService<Worker>();
  28. });
  29. //日志设置
  30. .ConfigureLogging(logging =>
  31. {
  32. logging.ClearProviders();
  33. logging.AddConsole();
  34. });
  35. }
  • 调用 CreateDefaultBuilder() 方法来创建和配置构建器对象。
  • 调用 Build() 创建一个IHost实例。
  • 在主机对象上调用 RunRunAsync 方法启动主机。

3. 注意要点

  1. Builder模式主要用于"分步骤构建一个复杂的象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
  2. 变化点在哪里,封装哪里 —— Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。缺点在于难以应对“分步骤构建算法”的需求变动。
  3. Abstract Factory模式解决“系列对象”的需求变化,Builder模式解决"对象部分”的需求变化。Builder模式通常和Composite(组合模式)组合使用。

原文链接:http://www.cnblogs.com/BigBrotherStone/p/builder.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号