Builder模式实现C#与JAVA

本文关键字:JAVA 实现 模式 Builder | 更新日期: 2023-09-27 18:29:41

我在JAVA中看到了一个Builder模式实现,它不同于C#版本和"四人帮"的"经典"插图。

C#-四人帮版本

Director director = new Director(); 
Builder b1 = new ConcreteBuilder1();
Builder b2 = new ConcreteBuilder2();
Product p1 = director.Make(b1);
Product p2 = director.Make(b2)

JAVA链接

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#中叫什么吗?

Builder模式实现C#与JAVA

这是不同的模式。

首先(C#)是构建复杂的对象

第二种(Java)对象构建器技术,无需外部构建器。

因此,这两种模式做了不同的事情,并且具有不同的范围

我见过它被称为静态生成器或流畅生成器。我建议使用"静态流畅生成器",因为该模式包括三个不同的元素。

  1. 构建一个复杂的产品对象
  2. 它有一个流畅的界面
  3. 它被实现为一个静态内部类

我进一步建议,这不是一个单一模式的C#与Java实现的问题,而是两个不同的模式。您可能会说,任何一种构建器类型,即GOF/Classicstatic fluent,都可以用任何一种语言进行编码,因为这两种语言都支持必要的功能。也可以说,静态流体版本是从经典版本衍生而来的,而且与更通用的构建器模式有着is-a关系。GOF版本可以在大多数面向对象的语言中实现,但新模式的静态内部并没有得到普遍支持,然而,就像另一个答案中提到的C#初始化器一样,可能有特定于语言的方法可以在其他语言中实现相同的结果。

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

它们都被认为是Builder模式,因为它们只是完成相同任务的两种方式。在您的文章中,您引用了C#代码片段中的GoF示例。Java示例来自Joshua Bloch的Effective Java。造成差异的关键原因是封装。另一个是用于构建对象的流畅DSL风格的接口。

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