我最近在Code Review上删除了我的一个Java答案,它的开始是这样的:
private Person(PersonBuilder builder) {
停止。红色标志。一个PersonBuilder将建立一个Person;它知道一个人。Person类应该对PersonBuilder一无所知-这只是一个不可变的类型。您已经在此处创建了圆形耦合,其中A取决于B,而B取决于A。
该人员应仅获取其参数;愿意创建一个人而不创建它的客户应该能够做到这一点。
我被选票打了耳光,并告诉我(引用)红旗,为什么?这里的实现与Joshua Bloch在其“ Effective Java”书(项目2)中演示的形状相同。
因此,看来在Java 中实现构建器模式的一种正确方法是使构建器成为嵌套类型(尽管这不是这个问题),然后制造产品(正在构建的对象的类) )对构建器的依赖,如下所示:
private StreetMap(Builder builder) { // Required parameters origin = builder.origin; destination = builder.destination; // Optional parameters waterColor = builder.waterColor; landColor = builder.landColor; highTrafficColor = builder.highTrafficColor; mediumTrafficColor = builder.mediumTrafficColor; lowTrafficColor = builder.lowTrafficColor; }
对于相同的Builder模式,相同的Wikipedia页面对于C#具有非常不同的实现(并且更加灵活):
//Represents a product created by the builder public class Car { public Car() { } public int Wheels { get; set; } public string Colour { get; set; } }
如您所见,此处的产品对Builder
类一无所知,并且它关心的所有事情都可以通过直接的构造函数调用,抽象工厂或构建器实例化。据我所知,产品创建模式的永远需要知道什么是创造任何东西。
我一直在接受反对论证(显然,在Bloch的书中明确辩护),可以使用构建器模式来返工一种类型,该类型会使构造函数with肿有许多可选参数。因此,与其坚持我的想法,不如我知道我在该站点上进行了一些研究,发现我怀疑,这种说法没有道理。
那怎么办?为什么要针对一开始就不应该存在的问题提出过度设计的解决方案?如果我们让约书亚·布洛赫(Joshua Bloch)离开他的基座一分钟,我们能否提出一个单一的,有效的理由来结合两种具体类型并将其称为最佳实践?
这一切对我来说都是崇尚货色的编程。