在研究构建器模式时,标准模式如下:
new SandwichBuilder().salami().pastrami().cat().build();
.salami(), .pastrami(), and .cat()
返回SandwichBuilders
,.build()
返回Sandwich
。
相反,它是否被认为是不好的风格,使用以下惯例?
new Sandwich().salami().pastrami().cat();
.salami(), .pastrami(), and .cat()
直接返回Sandwich
,前面看似不必要的并发症?
答案 0 :(得分:10)
构建器模式的最大优点之一是其构建的对象可以是immutable。假设您的第二个示例是不可能的,假设salami()
,pastrami()
等作为标准的设置者,或者如果他们每个都返回一个新的实例,那么它可能效率低下。
JB Nizet指向Guava的Splitter
,这是后一种情况的一个很好的例子。对于您的观点,Guava开发人员必须认为“在看似不必要的复杂化之前”是在创建自定义Splitter
期间容忍一些额外副本的充分理由。
答案 1 :(得分:3)
后者根本不是坏的风格,但它要求可以立即使用该对象,然后一次添加到一个属性。
在某些情况下,最好首先收集所有属性,然后执行一次创建事件,而不对每个其他属性进行重新创建或更新。
在三明治示例中,后者可能很好,并且不需要单独的构建器类。也许GUI控件想要先收集所有参数然后再做一次创建而不是为每个单独的参数重新创建/更新,在这种情况下,单独的Builder更合适。