为什么不直接使用构造函数?

时间:2019-03-01 10:53:03

标签: java spring design-patterns

我需要创建一个ScanOptions实例。正确的代码如下。

String pattern = "mykeyprefix_*";
Long cnt = 2000L;
ScanOptions options = ScanOptions.scanOptions().match(pattern).count(cnt).build();

我的问题是为什么不只使用构造函数直接创建对象?

scanOptions = new ScanOptions(parttern, cnt);

还是使用对象工厂创建实例?

options = ScanOptionsFactory.create(parttern, cnt);

那么设计代码作为第一种情况有什么好处?您能为我详细解释一下吗?非常感谢你!这是spring的源代码:

org.springframework.data.redis.core.ScanOptions

2 个答案:

答案 0 :(得分:2)

  1. 可选选项,保存版本

想象更多(可选)选项。这样一来,将需要多个构造函数,或者一个具有多个create方法的工厂。

所使用的构建器模式允许具有可变字段,因此下一个选项可能仍会以某种方式更改。在创建时,产生的类只有不可变的final 字段。

  1. 许多参数清晰明了

还请注意,对于许多选项,构建器模式会为每个选项命名;比较:

.withX(y).withY(x)

使用

(y, x)
  1. (就像工厂。)隐藏确切的实现子类[在这里不是这种情况]

另一种用法是由构建器返回派生类,实际上隐藏了实现类。

答案 1 :(得分:2)

好处是,将来期权的数量可能会增加。他们可能会考虑到这一点,所以他们从一开始就使用了构建器模式,因为对工厂或构造函数的更改可能非常困难。

约书亚·布洛赫(Joshua Bloch)在《有效的Java》第二章(第2篇)中很好地提到了这个问题。