2012-03-31 39 views
1

我看到一个在JAVA中的Builder模式实现,它不同于它的C#版本和Gang of Four书中的“经典”插图。Builder模式实现C#与JAVA

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(); 

我第一次看到的时候,我进入Android开发人员(我来自.NET世界)的JAVA用法 - 给我的JAVA版本比C#版本更优雅。

现在,底层实现有所不同,在JAVA示例中,Builder是嵌套的Product类,它的Build()方法返回其父类的构造实例;上面的C#解释与Abstract Factory更类似。

上面提到的一切都显然是2种不同的模式,虽然两者都是结构性的。有谁知道在C#中调用第二个示例吗?

+1

我不能真正回答你的问题,但在C#中,java样式有时可以被对象初始化器替换,如下所示:'new Product.Builder {Name =“Product”,Version =“v1”}。 Build();' – flai 2012-03-31 21:20:33

+0

您可以在C#中轻松实现“Java版本”(一个“流利”的构建器)。由于不同的可见性语义,实现细节略有不同,但可以使API以相同的方式读取。 – chris 2014-08-25 13:30:19

回答

1

我已经看到它被称为静态构建器或流利的构建器。我会建议“静态流利的建设者”,因为该模式包括三个不同的元素。

  1. 构建一个复杂的产品对象。
  2. 它有一个流利的接口
  3. 它实现为一个静态内部类。

我会进一步暗示它不是C#与单一模式的Java实现相比,而是两种截然不同的模式。您可以说,无论是哪一种构建器类型,即GOF /经典静态流利都可以用任一种语言编码,因为这两种语言都支持必要的功能。也可以说,静态流体版本是从经典版本衍生而来,并且与更一般的建造者模式有着一种关系。 GOF版本可以在大多数面向对象的语言中实现,但是较新模式的静态内部部分并未得到普遍支持,但是与另一个答案中提到的C#初始化程序一样,可能有语言特定的方法来在其他语言中实现相同的结果以及。

我很好奇为什么不在静态流利的构建器模式中使用director对象来处理排序和相关问题。这就是它在GOF模式中存在的原因。导演可以是静态的,并且构建器作为参数传入。

2

它是不同的模式,你有。

优先(C#)正在建造复杂的对象

二(Java)的对象建造技术,无需外部的建设者。

所以,这两种模式做不同的事情,并有不同的范围

+0

我同意,我甚至在我的帖子中指出,这些是2种不同的模式:)你会碰巧知道第二个例子的正式名称是什么? – AlexVPerl 2012-03-31 21:29:43

1

他们都认为Builder模式,因为它们只有两个完成同样的事情的方式。在你的文章中,你引用了C#代码片段中的GoF示例。 Java示例来自Joshua Bloch的Effective Java。差别的关键原因是封装。另一个是流利的DSL风格的界面,你有建设对象。

没有任何东西阻止你在C#中用Bloch描述它的方式实现Builder模式(好吧,几乎没有任何东西)。在Java中,外部类可以访问嵌套类的私有字段。这在.NET中是不可能的,所以你必须遵循不同的方法。这通常是通过将构建器中的对象状态复制到Build方法中的新实例中完成的。

+0

在Java中,如果你需要一个不可变的对象,你也可以通过复制对象状态来完成。所以Java给了你一个额外的选择,但是你在C#中的内容通常也会用Java来完成。 – Yishai 2013-09-11 16:58:51

+0

是的,我实际上更喜欢这种方法,但发现几个.NET示例提示该选项。 – SonOfPirate 2013-09-11 18:58:24