我在JAVA中看到了一个与C#版本不同的Builder模式实现,以及Gang of Four的“经典”插图。
C# - Gang of Four version
Director director = new Director();
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
Product p1 = director.Make(b1);
Product p2 = director.Make(b2)
JAVA - link
Product p1 = new Product.Builder("p1").Name("Product1").Version("v1").Build();
Product p2 = new Product.Builder("p2").Name("Product2").Version("v2").Build();
我第一次看到JAVA在进入Android开发时的用法(因为我来自.NET世界) - 对我而言,JAVA版本比C#版本更优雅。
现在底层实现不同,在JAVA示例中,Builder是Product的嵌套类,其Build()方法返回其父类的构造实例;上面的C#解释更类似于抽象工厂。
上面提到的一切都显然有两种不同的模式,尽管两者都是结构性的。有谁知道在C#中调用第二个例子是什么?
答案 0 :(得分:2)
这是你得到的不同模式。
首先(C#)正在构建复杂的对象
对象的第二(Java)构建器技术,没有外部构建器。
所以,这两种模式做了不同的事情,并且有不同的范围
答案 1 :(得分:1)
它们都被认为是Builder模式,因为它们只是实现同一事物的两种方式。在您的帖子中,您引用了C#片段中的GoF示例。 Java示例来自Joshua Bloch的Effective Java。造成这种差异的关键原因是封装。另一个是用于构建对象的流畅的DSL样式界面。
没有什么可以阻止你在C#中用Bloch描述它的方式实现Builder模式(好吧,几乎什么都没有)。在Java中,外部类可以访问嵌套类的私有字段。这在.NET中是不可能的,因此您必须遵循不同的方法。这通常通过将构建器中的对象状态复制到Build方法中的新实例来完成。
答案 2 :(得分:1)
我看到它被称为静态构建器或流畅的构建器。我建议使用“静态流利的构建器”,因为模式包含三个不同的元素。
我进一步建议,这不是C#与单个模式的Java实现的问题,而是两个不同的模式。你可能会说任何一种构建器类型,即 GOF / Classic 或 static-fluent 都可以用任何一种语言编码,因为两种语言都支持必要的功能。也可以说静态流体版本源自经典版本,并且还具有与更一般的构建器模式的is-a关系。 GOF版本可以在大多数面向对象的语言中实现,但是新模式的静态内部部分不是普遍支持的,但是像另一个答案中提到的C#初始化器一样,可能有语言特定的方式来实现其他语言的相同结果同样。
我很好奇为什么不会在静态流利的构建器模式中使用director对象来处理排序和相关问题。这就是它以GOF模式存在的原因。导演可以是静态的,并且构建器作为参数传入。