序言

吐槽:翻译的真是。。。。。

举例说明这个现象。
我们声明一个 Facts 的一个类,根据不同的需求来创建不同的构造参数,这种模式称之为重叠构造器。简而言之,重叠构造器虽然可行,但是参数一旦多了起来,简直是噩梦啊。。。

  1. public class Facts {
  2. private String a;
  3. private String b;
  4. private String c;
  5. public Facts(String a) {
  6. this.a = a;
  7. }
  8. public Facts(String a, String b) {
  9. this.a = a;
  10. this.b = b;
  11. }
  12. public Facts(String a, String b, String c) {
  13. this.a = a;
  14. this.b = b;
  15. this.c = c;
  16. }
  17. }

有什么方法可以解决吗?

JavaBean模式

这里呢懒省事,使用 LomBok 来生成get set

  1. @Data
  2. public class Facts {
  3. private String a;
  4. private String b;
  5. private String c;
  6. public static void main(String[] args) {
  7. Facts facts = new Facts();
  8. facts.setA("1");
  9. facts.setB("2");
  10. }
  11. }

这样子呢看似也没毛病。但是呢有一点需要注意,这种方式创建的对象,如果有多个线程去访问,那么你一肯定是要付出额外的努力来确保他是线程安全的。那么还有啥好办法吗

构建器模式(Builder)

废话不多说看代码

  1. public class Facts {
  2. private String a;
  3. private String b;
  4. private String c;
  5. public static Facts.FactsBuilder builder() {
  6. return new Facts.FactsBuilder();
  7. }
  8. public static class FactsBuilder {
  9. private String a;
  10. private String b;
  11. private String c;
  12. FactsBuilder() {
  13. }
  14. public Facts.FactsBuilder a(String a) {
  15. this.a = a;
  16. return this;
  17. }
  18. public Facts.FactsBuilder b(String b) {
  19. this.b = b;
  20. return this;
  21. }
  22. public Facts.FactsBuilder c(String c) {
  23. this.c = c;
  24. return this;
  25. }
  26. public Facts build() {
  27. return new Facts(this.a, this.b, this.c);
  28. }
  29. }
  30. public static void main(String[] args) {
  31. Facts build = Facts.builder().a("1").b("2").build();
  32. }
  33. }

Builder模式可以自选参数,十分灵活,并且这样构建可以不用担心线程问题的。
如果类的构造器或者静态工厂中具有多个参数,设计这种类的时候,Builder也许是你的不二选择。
当然如果受够了去写这些静态内部类,可以使用 lombok 来生成哟~~~

  1. @Builder
  2. public class Facts {
  3. private String a;
  4. private String b;
  5. private String c;
  6. public static void main(String[] args) {
  7. Facts build = Facts.builder().a("1").b("2").build();
  8. }
  9. }