在研究构建器模式时,标准模式如下:
new SandwichBuilder().salami().pastrami().cat().build();
哪里.salami(), .pastrami(), and .cat()
的回报SandwichBuilders
,并.build()
返回Sandwich
.
相反,它被认为是不好的风格,使用以下约定?
new Sandwich().salami().pastrami().cat();
在哪里直接.salami(), .pastrami(), and .cat()
返回Sandwich
,前面看似不必要的并发症?
构建器模式的最大优点之一是其构建的对象可以是不可变的.你的第二个例子是不可能的,假设salami()
,pastrami()
等等作为标准的setter,或者如果它们各自返回一个新的实例,它可能是低效的.
JB Nizet指向Guava's Splitter
,这是后一种情况的一个很好的例子.对于您的观点,Guava开发人员必须认为"在看似不必要的复杂化之前"是足以在创建定制Splitter
s 期间容忍一些额外副本的理由.