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

python - Python中等效的构建器模式

在 Java 中,您可以使用构建器模式来提供一种更易读的方法来实例化具有许多参数的类。在构建器模式中,使用设置命名属性的方法构造一个配置对象,然后使用它来构造另一个对象。

Python中的等价物是什么?模仿相同实现的最佳方法是什么?

0 投票
2 回答
493 浏览

java - 我可以从建设者那里获得匿名课程吗?

我知道在手动创建它的实例时可以创建一个匿名类,如下所示:

但是,有些类使用构建器模式来创建新实例。我的问题是是否有一个技巧可以让我使用其超类提供的构建器创建一个匿名类。

0 投票
2 回答
130 浏览

java - 所有子类(泛型?)的一种构建器方法实现

我的困境在于创建一种遵循构建器模式的方法,该方法设置一个变量并返回自身,但我有一个由其他访问者实现实现并扩展Visitor的接口。BasicVisitor

此外,我有一个Visitable接口,该接口由其实现SampleVisitable并具有保留所有访问者历史记录的方法。


所以问题是我只想在访问者的历史记录中保留SampleVisitable访问者是否“重要”的完整参考,因为主机Visitor.clean()在访问者访问之前调用,这会清除上次访问的所有数据,但我想要“重要”访客的数据留在历史中。

这是我迄今为止的实施:

这是该SampleVisitable课程的一个片段:

然后我有BasicVisitor哪个实现了该important()方法。现在我不想important()每次都重写该方法,但是通过我的实现,我必须这样做,因为如果其他访问者使用该important()方法,则会出现“无法从 BasicVisitor 转换为 [OtherVisitor]”形式的错误不覆盖它:

做这个的最好方式是什么?我需要让这个特性实现一次,并且可供所有其他子类使用,而不需要它们覆盖它。谢谢!

编辑:

哇,抽象类正是我想要的!我做了更多研究,发现这篇关于接口和抽象类之间差异的帖子,我希望它可以帮助其他人寻找答案。

发布此答案后,我意识到在这种情况下我不必使用构建器模式,我可以创建一个setImportant( boolean isImportant )并且基本上可以满足我的需要,但我很高兴我还是问了,因为这就是我需要另一个设计问题。

编辑2:

important()在尝试了抽象类之后,我的主要问题仍然存在,我仍然需要重写Visitor.

伊利亚

0 投票
1 回答
2321 浏览

java - 使用内部类使用 Builder 模式扩展对象

我要做的是创建一个使用 Builder 模式的类 ( ),然后在需要它的对象() 中将Square该类扩展为内部类 ( )。MyCubeDrawMyCube

出于有点复杂的原因,最好将它们扩展为内部类(对局部变量的引用)。

我试图使示例尽可能简单,因为实际用例太复杂而无法在此处使用:

现在我需要在这里扩展和使用它:

然而问题是内部类中的静态生成器:

成员类型 Builder 不能声明为静态的;静态类型只能在静态或顶级类型中声明。

或者,我可以将内部类创建MyCube为常规类,但问题是我无法引用DrawMyCube类内部的任何内容(在实际用例中,有很多对这些内容的引用)。

0 投票
3 回答
190 浏览

python - Python,结合长构建器路径和注释

可能重复:
如何在 Python 中打破一行链式方法?

以下问题是关于 python 代码风格的,可能是可重用库的设计。因此,我有将图形创建链接到单个大线的构建器,如下所示:

在第 4 行,我收到关于错误符号 (#) 的错误。所以一般问题如何针对长构建器路径生成注释良好的代码。同样作为一个很好的答案,我将感谢有关更改构建器以允许注释以澄清代码的建议。

0 投票
2 回答
102 浏览

java - 在不使用字符串的情况下使数据库表选择尽可能静态

首先,这个问题会有点长,但为了完整地解释我的问题,我觉得我必须给你很多关于我的项目的信息,所以请多多包涵!

我在一家经常使用图表的公司工作,为了避免总是不得不从 scats 创建图表的麻烦,我决定创建一个新的 java 项目并创建一个“包”,我和我的同事可以使用它来创建这些图表。你可以称它们为通用的。

所以这个项目使用了构建器模式和大量的接口和抽象类。这个想法是客户端(开发人员)使用这些接口、模式和类并覆盖这些方法以适应流程。客户(开发人员)唯一剩下的事情就是填写这些方法并为他自己创建 UI 并发布程序。

该程序正在很好地形成,我创建了很多我非常自豪的功能(因为我是学生)我认为我已经很好地规划了整个过程,但我遇到了一些问题!

首先,让我向您展示这些类并解释数据流(我会尽可能短):

首先是 GUI(这是一个用户必须自己创建的类,但他可以使用内置包通过以下代码创建他的图表):

有了这个,导演现在准备建立一个图表。

PeroidSelection.Hour是一个设置标准时间的枚举,在这种情况下它将图表类别轴设置为我们打开我们的时间,因此收集的数据知道它必须每小时获取数据(在这种情况下从 8.00 - 19.00)原因为什么这是一个枚举是因为这些类型的时期是最后唯一可以改变的是我们的开放日期和时间,然后我们将能够很容易地改变!这是预览PeriodSelection enum

进入 Director,director 现在已准备好构建图表,但首先它必须从数据库中收集数据:

正如您所看到的,构建器是以某种方式构建的,这是因为图表由表格和图表组成,并且这两者必须链接在一起,我不会详细介绍图表,因为它与我的问题。

现在,方法的第一行中显示的 stat 类buildTypeOneextends 和调用的抽象类statisticPattern看起来像这样:

如前所述,此类的目的是我们的开发人员将扩展类并覆盖方法,以便主管可以找到这些方法并使用它们,他们选择实现和填充方法的方式因程序而异。

在这个程序中,统计类看起来像这样:

如您所见,我创建了自己的方法实现,getData该方法调用该obtainNewData方法,然后从 p (我们的提供程序类 - 也称为与数据库的连接)获取数据。

您可能已经猜到的提供程序类也实现和接口,其中方法中只有一个obtainData方法

}

同样,开发人员必须实现此方法,但可以随心所欲地填充它。这里最重要的是返回类型是 ObjectInterface 类型的 ArrayList:

}

基本上,它必须实现一个包含图表应填充的所有数据的哈希图。此数据将在创建对象时添加,然后添加到提供程序中的列表中,然后将返回此列表,然后 Director 将其设置为 chartbuilders 的数据列表,然后填充图表。

在这种情况下,必须填充图表的最终对象如下所示:

现在问题来了!

当只收集一种类型的数据时,所有这些都可以完美运行。但是我目前正在处理的程序必须从 5 个不同的表中获取数据,所有这些表都必须添加到他们的每个图表中我的问题是我将如何设计它以便它选择数据库表?并返回该特定表的列表?

我已经尝试过以下代码:

然而,至少可以说,这似乎有点多余,而且很难看。

我曾考虑过再次创建一个枚举,客户(开发人员)每次想要创建一个新程序时都必须更改,但我不确定这是正确的方法吗?

我也很想听听您对整个项目的看法?我是成功了还是失败了?

感谢您阅读,我将期待阅读您的回复

0 投票
5 回答
3136 浏览

java - Java接口的不可变类和匹配构建器类的自动生成

Java 存在哪些工具或库,它们将interface只使用访问器方法定义并自动生成不可变对象类以及用于增量构建新实例或通过创建新实例来更改现有实例的“构建器”类?

示例输入:

示例输出:

0 投票
1 回答
1202 浏览

scala - 处理对象字段验证的最佳方法 => 要么 / Try (scala 2.10) / ValidationNEL (scalaz)

让我们假设一个使用构建器模式构造的对象。

此构建器模式将包含一个build专注于字段验证然后转换为目标类型的方法。

可以使用以下方式实现此验证:

  • Either[FailureObject, TargetObject]类型
  • Try[TargetObject](Scala 2.10 的新功能)
  • Validation[FailureObject, TargetObject]ValidationNEL[FailureObject, TargetObject]来自 scalaz 库

Validation我读到过Either类型的主要优点之一是Validation可以“开箱即用”累积故障。

但是“新”Try方式呢?我注意到它Try也有开箱即用的“单子”方法,比如mapflatMap等等......在没有Projection.

因此,我想每个字段验证方法都返回 a Try[FieldType],更准确地说,如果出现任何故障, a Try[SpecificFieldExceptionType]; 这个嵌套的包含一个Stringmessage 字段和一个 rootCause 字段,可以在整个build方法中累积。

使用 Scala 2.10,是否可以或应该Try练习替换 scalaz 验证库以进行简单的验证,如构建器模式所涉及的?

**编辑* ***

通过阅读Try源代码,听起来Try无法累积多个异常,因此面向快速失败。EvenTry.flatMap返回潜在的先前失败,因此没有累积的概念:

相反ValidationNEL,处理累积功能。

有什么确认吗?

0 投票
4 回答
4768 浏览

oop - 构建器模式:Director 为什么要构建对象?

我正在学习建造者模式

在上面的链接(Java 示例)中,我注意到 Builder 提供了构造多个组件的接口。除了调用它们,我们还调用了 getProduct()。

我不明白的一点是,为什么Director需要一个一个调用所有这些组件构造方法并最终得到结果。

}

为什么不将构建组件1、2、3的代码包含在它自己的ConcreteBuilder类中而不是Director中,实际上去掉Director层。

我知道上述方法可能会将 Builder 模式转变为其他模式,但我不明白 Director 为何要一步一步地完成这项工作。有什么好处?如果有多个导演,就会有重复的代码,对吧?我可能不理解执行构建器模式背后的动机......

更新:构建器模式是否专注于在创建更大的复杂对象时提供可定制的组件选择?否则,截至目前,我没有看到引入额外层 Director 的意义。

即使是这样,装饰器模式也可能是一个更好的主意,通过动态自定义组件来完成同样的任务。在某个地方我错过了 Builder 背后的要点.. :(

0 投票
2 回答
2690 浏览

java - 构建器模式:首选哪个变体?

我正在阅读 Effective Java 书,并为我的未来参考创建笔记,我遇到了 Builder Pattern。

好吧,我了解它是什么以及它应该如何使用。在此过程中,我创建了构建器模式的两个示例变体。

我需要帮助来列出差异和各自的优势吗?好吧,我当然注意到,Example 1公开的方法更少,限制更少,更通用,允许更灵活地使用。

请指出我错过的其他事情?

示例 1

示例 2