问题标签 [builder-pattern]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
5476 浏览

java - 如何在我的 ModelInput 类中使用 Joshua Bloch 版本中描述的 Builder 模式?

我正在尝试为下面的类使用 Builder 模式。最初我使用类的构造函数来设置所有参数,但不小心遇到了 Builder 模式,它看起来很适合我的用例。

下面是我的课程,大多数人都会通过userIdclientId并且parameterMap总是但其他字段是可选的,他们可能会通过也可能不会通过。而且,如果他们没有传递任何超时值,我需要始终将默认超时值设置为 500,但如果他们传递任何超时值,那么它应该覆盖我的默认超时值。这里的 Preference 是一个有四个字段的 ENUM。

下面是一个示例,我最初是如何ModelInput通过将参数传递给构造函数来构造对象的。最初我传递了所有参数,但客户端大多会传递userIdclientId并且parameterMap总是和其他字段是可选的..

如何转换上面的代码以开始使用 Bloch 在 Effective Java 中所说的 Builder 模式,它也是线程安全且不可变的?

以及如何使用 Builder 模式对此进行验证检查?人们可能会传递与客户端 ID 和超时相同的 userId 零或负数,也可能与 map 相同..

0 投票
2 回答
11837 浏览

java - 如果未传递该值并且还使线程安全,如何在构建器模式中使用默认值?

我正在尝试为我的班级使用 Builder Pattern..

下面是我按照 Joshua Bloch 在 Effective Java, 2nd Edition 中展示的版本构建的 Builder 类。我们的客户通常会通过userIdclientId但其他字段是可选的,他们可能会通过也可能不会通过。这里的 Preference 是一个包含四个字段的 ENUM 类。

下面是我的枚举类 -

我正在拨打这样的电话来构造InputKeys参数 -

我在这里看到的唯一问题是,如果客户没有传递任何超时值,我需要始终将默认超时值设置为 500,但如果他们传递任何超时值,那么它应该覆盖我的默认超时值。这对我不起作用,因为当我keys在调试模式下看到我的时,它的超时值始终为 0。

有什么我想念的吗?而且我也试图使这个类不可变和线程安全。这是一个线程安全和不可变版本的 Builder 还是我错过了什么?

更新:-

人们将使用它的特定场景是我们有一个工厂,客户将使用它来调用我们的代码。我们有一个简单的接口,我们的一个类正在实现它,然后我们有一个工厂,我们将通过该工厂调用该实现的某个方法,该方法接受该keys参数。

所以他们将在应用程序中使用下面的代码进行调用,并且他们可能会在多线程环境中运行应用程序。

然后 InputKeys Builder 可以多次使用来构造键,不是一次。无论他们将获得什么 userId 和 clientId,他们都将再次构造 InputKeys。

0 投票
3 回答
1365 浏览

java - 如何检查 Builder 模式类中的无效输入?

下面是我的构建器类,其中两个字段是必需的,它们是userIdclientId

现在我将像这样调用这个构建器类 -

但也有可能有人会传递错误的输入值,例如他们传递负的 userId 和负的 clientId、负的超时值或空的属性映射。如何在我的构建器类中处理这种情况?

如果我对 中的每个变量都有 IllegalArgumentcheck if else if block,那么我的整个 Builder 类会被 IllegalArgumentException 检查淹没吗?

有没有更好的方法来做到这一点?

0 投票
1 回答
3908 浏览

factory-method - 生成器与工厂方法模式

我正在阅读有关 Builder 模式的内容,并且像往常一样对 Factory 模式感到困惑。

我看过一篇很好的文章,它展示了抽象工厂模式和构建器模式之间的区别。

http://champika-nirosh.blogspot.in/2008/04/what-is-difference-between-abstract.html

但我的困惑是,除了类似于抽象工厂的 Builder 模式,我觉得它类似于工厂方法模式。不确定我的理解是否正确。但是在工厂方法中,我们也使用单独的工厂(具体工厂中的方法)来创建一个特定的对象(不是产品系列)。在那种情况下,Builder 与工厂方法模式有何不同。我知道 Builder 需要更多的步骤来创建对象,除此之外,我们需要使用一个而不是另一个的任何特定场景吗?请指导我。

谢谢。

0 投票
2 回答
57 浏览

c# - 如何制作接口列表以执行操作

我知道这个问题可以通过说来回答,foreach(var item in items){item.doSomething()};但我所追求的略有不同。这里是界面。

可管理类 .cs

下面是我希望看到我的代码的样子

MainManagerClass.cs

我知道这里的这段代码不起作用,但似乎这在 C# 中应该是可行的。有人知道这是否可以做到吗?如果不是,这不像是世界末日,我只会foreach在每种方法中做一个。

0 投票
1 回答
1115 浏览

java - 如何从超类方法返回子类引用

我有一个返回自身的超类方法(对于构建器模式)。这个类有几个子类,所以我想返回一个对对象的实际(子类)类型的引用。像这样的东西:

这样我就可以从子类引用中调用其他子类方法而无需强制转换。像这样:

这是可能的吗?尝试做这样的事情是否有意义?

0 投票
1 回答
848 浏览

design-patterns - IntelliJ 中 Fluent-API Builder 的实时模板

如果我想在 IntelliJ 中生成“流利的构建器”,那么任何人都知道在哪里编辑“用构建器替换构造器”功能中使用的实时模板?

上面提到的功能将自动构建一个 Builder 模式对象,尽管使用通用的 setAttribute 命名约定,而不是我正在寻找的 .attribute 或 .withAttribute 的更流畅的命名模式。

最终,我希望能够更改用于呈现代码的设置/模板,类似于如何更改 IntelliJ 中各种其他自动生成代码的格式。

0 投票
4 回答
5562 浏览

java - 使用构建器模式最多设置一次值

在使用构建器模式时,Java 中是否有标准做法,以确保成员变量最多设置一次。我需要确保 setter 被调用 0 或 1 次,但不会更多。我想抛出RuntimeException某种类型的,但我担心同步问题以及该领域的最佳实践。

0 投票
2 回答
4861 浏览

java - 使用反射的通用生成器模式类

用泛型实现构建器模式会很棒。理论上,可以使用反射来实现以下目标:

我已经编写了以下代码:

如何实现?

0 投票
1 回答
3751 浏览

java - 客户端库的 Builder 模式的 Guice 注入

我是 Google Guice 的新手,我正在努力思考如何在我的特定场景中使用它。我正在构建一个非常复杂的服务客户端,并且(我相信)确实需要正确实例化构建器模式。因为这个客户端最终会被打包到它自己的 JAR 库中,所以我希望 Guice 在后台处理 DI。下面是我的代码的一个大大简化的版本:

如您所见,层次/深度图如下:

  • MyClient应该注入*ResourceImpls
  • 每个都*ResourceImpl应该注入一个*Command实例

预期的用例是使构建MyClientimpl 变得简单:

所以这是我最好的尝试MyClientImpl,它的内部构建器和我的 Guice 模块:

但是对于我的生活,我看不到如何/在哪里:

  • 将 s绑定*Command*ResourceImpls;和
  • *ResourceImpl将s绑定到MyClientImpl实例

有任何想法吗?