问题标签 [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 投票
1 回答
1862 浏览

java - 我可以配置 myBatis 以使用 Builder 模式创建类的实例吗?

我有一个(Java)类,其中包含许多实例字段(其中许多是可选的)。我希望所有字段(因此类)都是不可变的。所以,我想使用构建器模式来构建类的实例。

我可以配置 myBatis 以使用 Builder 模式创建类的实例吗?我知道我可以让 myBatis 返回一个地图并使用该地图在我的代码中构建实例。但是,我正在寻找一种配置此映射(或使用某种约定)的方法,类似于如何通过使用 Java Bean 和构造函数来创建实例。

编辑(包括一个例子)

这是一个例子:

然后,我有一个映射器:

最后,我有映射器界面:

我还希望能够通过 myBatis 使用静态工厂方法创建实例。例如:

具体来说,如何让 myBatis 调用 newInstance(String, String)?

0 投票
4 回答
364 浏览

java - 建造者模式的正确使用

我正在考虑使用在我的应用程序builder pattern中创建复杂objects的。但是,我担心它是否是正确的使用模式。

举个例子;在这里,我们看到PizzaBuilders正在创建的几个混凝土效果很好。但是,在我的应用程序中,我需要能够传递一些与正在构建的内容相关的信息。例如,在我的情况下,PizzaBuilders我需要创建一个custom pizza用户可以选择某些东西的能力,例如saucetoppings. 值得注意的是,我需要传递给构建器的信息会有所不同。

请您告知我是否正在考虑使用正确的模式来解决这个问题,或者是否有其他更适合的模式?如果这是问题的正确模式,那么请您建议将信息传递给建设者的最干净的方式吗?它会在实例化点吗?

0 投票
2 回答
1106 浏览

java - Java模式构建必须设置任何一个字段的对象?

我需要构建具有 3 个字段的类的对象:A、B 和 C。有效对象至少具有用户设置的 A、B 或 C 之一。我查看了Builder Pattern,这与我想要的很接近,但只有 1 个字段是强制性的。我希望必须将 1 字段设置为我拥有的 3 个字段中的任何一个。有什么建议么?

我的替代方法是使用 7 个构造函数(对于 {A}、{B}、{C}、{A,B}、{B,C}、{A,C}、{A,B,C})

0 投票
2 回答
3870 浏览

c++ - 具有继承的 C++ Builder 模式

我有一个我想在其上使用构建器模式的类,但它派生自一个我需要访问其属性的基类。我无法BaseClass在不公开的情况下访问我的实现中的成员,即使我从 BuilderBaseClass或同样臭的东西派生。我的课程:

基类.h:

派生类.h:

派生类.cpp:

我的问题是我无法访问builder.name。Visual Studio 说“受保护BaseClass::name的成员不能通过DerivedClass::Builder指针或对象访问”。我试过摆弄Buildera friendof BaseClass,但无济于事。这篇文章也提供了一种解决方法,但它是针对 Java 的,而且非常混乱。

有没有一种体面的方法可以在 C++ 中使用具有继承的构建器模式?

0 投票
1 回答
546 浏览

c++ - 将生成器模式拉入配置的 C++ 模板问题?

我有一个算法,它需要大量参数(即配置)作为其构造函数的一部分,并且还需要一些明确定义的创建步骤。因此,我创建了一个Builder Pattern实现,它允许设置所需的参数并创建中间和最终实例,例如

现在我将 Builder 定义为例如

此时一切看起来都不错,但现在我想将Pull Up构建器的设置器放入一个SomeAlgoConfig类中,这样我还可以涵盖传递简单配置而不是复杂的长参数列表的用例。这种简单的配置在 Java 中被称为值对象或 Bean。新的 Builder 将是这样的:

现在SomeAlgoConfig实现:

并且意图是这样使用的:

我猜这可以解决问题。但是,每当我想单独使用SomeAlgoConfig(在 Builder 的上下文之外)例如将其作为参数传递时,我需要使用本身的模板参数来声明它SomeAlgoConfig<SomeAlgoConfig>。如何以默认为模板类型的方式定义它?例如,这样做是行不通template<typename T = SomeAlgoConfig> class SomeAlgoConfig的:因为SomeAlgoConfig那时还不知道。

0 投票
1 回答
1909 浏览

java - 如何将 REST 请求的参数传递给 Java 方法?

我们正在构建一个 Java SDK 来简化对我们提供 REST API 的服务之一的访问。此 SDK 供第 3 方开发人员使用。

问题之一是找到一种表示每个请求的可选参数的好方法。

假设我们有 rest 端点:GET /photos 它有几个可选参数:sortBypageSizepageNumber等。

一种解决方案是接受 aMap<String,String>作为代表该休息调用的 api 方法的参数。

这个解决方案有几个问题:

  • 该方法的签名没有向开发人员提供有关此方法可用的可选参数的名称(以及有效值)的信息。他需要查阅 REST api 文档,理想情况下我们希望避免这样做。
  • 开发人员最终会为他将调用的方法创建几个带有参数的 Map,并在各处硬编码参数的名称和值。这意味着如果它们发生变化,修复它们将很麻烦。

另一种解决方案是使用包含可选参数信息的 Options 对象。我们甚至可以使用构建器模式来构建这个对象。

这就是方法签名的样子:

开发人员现在知道什么是可用的可选参数,并且可以轻松地构建PhotosOptions这样的:

问题是我们试图用 SDK 覆盖的服务有大量需要我们实现的请求,而且几乎所有请求都有不同的选项列表,它们允许。这可能会导致大量的 Options 类。

这里最好的解决方案是什么?为每个组合构建一个 Options 对象(及其构建器)?继承在这里并没有太大帮助,因为我有各种参数组合。

0 投票
0 回答
106 浏览

c# - 这是在正确的创作模式方式上吗?

我是设计模式的新手,想知道下面列出的代码片段中特定类型的设计模式是什么(如果有的话)。

基本上有一个基类,它知道如何构建一个 BaseProperty 对象:

, 这里有一个子类实现它自己的属性构建细节

在这段代码中,我实现了工厂模式,可以看出子类实现了自己的属性创建方法。目的是收集所有创建对象的属性以进行持久存储。

让我感到困惑的是,在创建 BaseProperty 对象之后,然后以增量方式“制造”,从base.BuildProperty(prop)构建基本部分开始,然后将对象向下转换NumberProperty为构建其子类特定部分的对象。

我做得对吗?有一个向下铸造操作......应该避免吗?如果是这样,该怎么做?

谢谢!

0 投票
1 回答
1008 浏览

java - 如何强制 eclipse 使用 return 语句生成我的设置器

我希望我的 eclipsethis在生成的 setter 中返回。这对Builder-Pattern非常有用

eclipse默认做什么:

我想要日食做什么:

我发现了一些可以在下面修改的模板:

Preferences -> Java -> Code Style -> Code Templates

但是只能编辑 setter 的主体而不是 setter 签名。

0 投票
1 回答
2970 浏览

java - Builder Pattern Returning null

I am using builder pattern but after setting the feilds its returning nullpointerException:

here is the BaseServiceRequest.java ::

here is the main class::

I should get a output of 23 at request.getMessageID().getBOI1(),
but getting a null pointer Exception

0 投票
2 回答
6836 浏览

java - 使 Bloch 的构建器模式线程安全:如果从不无效,则在封闭构造函数中重新检查是否必要?

我最近学习了Joshua Bloch 的构建器模式,用于创建具有许多可选字段的对象。多年来我一直在使用类似的东西,但在 Bloch 的书向我推荐之前从未使用过内部类。我喜欢它。

我知道另一个线程可能会在实际构建之前(使用build())更改 bulider 的配置,因此可能需要重新验证封闭类的构造函数中的所有值。下面是一个可选地重新验证其数据的构建器类的示例。

所以我的问题是:假设这是一个足够健壮的设计,当所有值都有默认值时——知道这个类是使用默认值的糟糕选择——并且当每个设置尝试都得到验证时,是否需要重新检查? 虽然它可能不同,但它永远不会无效。那是对的吗?

(尽管这种设计是易于管理的,但由于可能需要重新验证,它肯定会变得复杂。而且,老实说,我从不使用多线程,但我不想让我的库无法被这样做的人使用。)

谢谢你的任何建议。