是什么?

建造者模式是一步一步创建一个复杂的对象,形如Builder.builder.a().b().c().build();它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
构建者模式提供了一种极佳的复杂对象的创建方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

适用场景?

复杂对象的创建场景
一个复杂对象由多个零部件构成,用户只需一步一步安装零部件即可

代码实现

简单对象演示

假设一个产品对象Product只有一个属性name产品名称,其构建者模式如下:

  1. /**
  2. * 简单对象-产品类
  3. * 只有一个属性:产品名称
  4. *
  5. * 演示构建者模式
  6. */
  7. public class Product {
  8. //产品名称
  9. private String name;
  10. //全参构造函数
  11. public Product(String name) {
  12. this.name = name;
  13. }
  14. //获取构建者
  15. public static ProductBuilder builder(){
  16. return new ProductBuilder();
  17. }
  18. //产品构造器提供者
  19. static class ProductBuilder{
  20. //复制Product的所有属性,作为暂存备份,构建对象时线程安全
  21. //产品名称
  22. private String name;
  23. public ProductBuilder name(String name){
  24. this.name=name;
  25. return this;
  26. }
  27. //构建对象方法
  28. public Product build(){
  29. //一次性new对象,保证线程安全
  30. return new Product(name);
  31. }
  32. }
  33. }

使用非常简单方便

  1. Product.builder().name("产品名称").build();

复杂对象演示

复杂对象才能体现构建者模式的价值,
假设一个复杂的产品,由多个部件组成,使用构建者模式创建该产品的过程如下:

  1. //定义产品
  2. /**
  3. * 复杂产品由多个部分组成
  4. * PartA A部分
  5. * PartB B部分
  6. * 等等
  7. */
  8. public class Product {
  9. private Integer id;//产品唯一标识
  10. private String name;//产品名称
  11. private PartA partA;//零部件A
  12. private PartB partB;//零部件B
  13. static class PartA {
  14. private String name;//零部件A的名称
  15. }
  16. static class PartB {
  17. private Integer id;//零部件B的唯一标识
  18. private String name;//零部件B的名称
  19. private PartA partA;//零部件A
  20. }
  21. }

构造者模式创建如上复杂产品对象,为产品Product创建构建者模式类

  1. /构造类对象
  2. public static class ProductBuilder {
  3. //冗余对象,保证创建对象得线程安全
  4. private Integer id;
  5. private String name;
  6. private PartA partA;
  7. private PartB partB;
  8. ProductBuilder() {
  9. }
  10. public ProductBuilder id(final Integer id) {
  11. this.id = id;
  12. return this;
  13. }
  14. public ProductBuilder name(final String name) {
  15. this.name = name;
  16. return this;
  17. }
  18. public ProductBuilder partA(final PartA partA) {
  19. this.partA = partA;
  20. return this;
  21. }
  22. public ProductBuilder partB(final PartB partB) {
  23. this.partB = partB;
  24. return this;
  25. }
  26. public Product build() {
  27. return new Product(this.id, this.name, this.partA, this.partB);
  28. }
  29. }

同理给PartA和PartB创建构造者模式类

  1. public static class PartABuilder {
  2. private String name;
  3. PartABuilder() {
  4. }
  5. public PartA.PartABuilder name(final String name) {
  6. this.name = name;
  7. return this;
  8. }
  9. public PartA build() {
  10. return new PartA(this.name);
  11. }
  12. }
  13. public static class PartBBuilder {
  14. private Integer id;
  15. private String name;
  16. private PartA partA;
  17. PartBBuilder() {
  18. }
  19. public PartB.PartBBuilder id(final Integer id) {
  20. this.id = id;
  21. return this;
  22. }
  23. public PartB.PartBBuilder name(final String name) {
  24. this.name = name;
  25. return this;
  26. }
  27. public PartB.PartBBuilder partA(final PartA partA) {
  28. this.partA = partA;
  29. return this;
  30. }
  31. public PartB build() {
  32. return new PartB(this.id, this.name, this.partA);
  33. }
  34. }

类全貌如下:

  1. /**
  2. * 复杂产品由多个部分组成
  3. * PartA A部分
  4. * PartB B部分
  5. * 等等
  6. */
  7. public class Product {
  8. private Integer id;//产品唯一标识
  9. private String name;//产品名称
  10. private PartA partA;//产品A部件
  11. private PartB partB;//产品B部件
  12. //全参构造方法
  13. Product(final Integer id, final String name, final PartA partA, final PartB partB) {
  14. this.id = id;
  15. this.name = name;
  16. this.partA = partA;
  17. this.partB = partB;
  18. }
  19. //构造方法
  20. public static ProductBuilder builder() {
  21. return new ProductBuilder();
  22. }
  23. //构造类对象
  24. public static class ProductBuilder {
  25. //冗余对象,保证创建对象得线程安全
  26. private Integer id;
  27. private String name;
  28. private PartA partA;
  29. private PartB partB;
  30. ProductBuilder() {
  31. }
  32. public ProductBuilder id(final Integer id) {
  33. this.id = id;
  34. return this;
  35. }
  36. public ProductBuilder name(final String name) {
  37. this.name = name;
  38. return this;
  39. }
  40. public ProductBuilder partA(final PartA partA) {
  41. this.partA = partA;
  42. return this;
  43. }
  44. public ProductBuilder partB(final PartB partB) {
  45. this.partB = partB;
  46. return this;
  47. }
  48. public Product build() {
  49. return new Product(this.id, this.name, this.partA, this.partB);
  50. }
  51. }
  52. private static class PartA {
  53. private String name;
  54. PartA(final String name) {
  55. this.name = name;
  56. }
  57. public static PartA.PartABuilder builder() {
  58. return new PartA.PartABuilder();
  59. }
  60. public static class PartABuilder {
  61. private String name;
  62. PartABuilder() {
  63. }
  64. public PartA.PartABuilder name(final String name) {
  65. this.name = name;
  66. return this;
  67. }
  68. public PartA build() {
  69. return new PartA(this.name);
  70. }
  71. }
  72. }
  73. private static class PartB {
  74. private Integer id;
  75. private String name;
  76. private PartA partA;
  77. PartB(final Integer id, final String name, final PartA partA) {
  78. this.id = id;
  79. this.name = name;
  80. this.partA = partA;
  81. }
  82. public static PartB.PartBBuilder builder() {
  83. return new PartB.PartBBuilder();
  84. }
  85. public static class PartBBuilder {
  86. private Integer id;
  87. private String name;
  88. private PartA partA;
  89. PartBBuilder() {
  90. }
  91. public PartB.PartBBuilder id(final Integer id) {
  92. this.id = id;
  93. return this;
  94. }
  95. public PartB.PartBBuilder name(final String name) {
  96. this.name = name;
  97. return this;
  98. }
  99. public PartB.PartBBuilder partA(final PartA partA) {
  100. this.partA = partA;
  101. return this;
  102. }
  103. public PartB build() {
  104. return new PartB(this.id, this.name, this.partA);
  105. }
  106. }
  107. }
  108. }

测试代码,构建者模式创建对象:

  1. Product build = Product.builder()
  2. .id(1)
  3. .name("测试产品")
  4. .partA(
  5. PartA
  6. .builder()
  7. .name("零部件A")
  8. .build()
  9. )
  10. .partB(
  11. PartB
  12. .builder()
  13. .id(1)
  14. .name("测试产品")
  15. .partA(
  16. PartA
  17. .builder()
  18. .name("零部件A")
  19. .build()
  20. )
  21. .build()
  22. )
  23. .build();