问题标签 [static-factory]

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 投票
2 回答
1266 浏览

java - 单例和静态工厂方法有什么区别

我想知道单例和静态工厂方法是否都只创建一个实例,那么为什么有两个概念用于同一目的?

注意:这里的术语“静态工厂方法”取自 Joshua bloch 的 Effective java book,他在其中写道:

执行此操作的类被称为实例控制的。编写实例控制类有几个原因。实例控制允许一个类保证它是单例(第 3 项)或不可实例化(第 4 项)

0 投票
2 回答
562 浏览

java - 使用静态工厂的不可变类

我正在研究 Joshua Bloch 的 Effective Java,他解释了实现不可变类的不同方法。为了防止子类化,一种方法是使用final。更复杂的方法是将构造函数设为私有,从而防止外部访问,并使用静态工厂创建对象。

但是,我不明白这个说法:

它是最灵活的,因为它允许使用多个包私有实现类。

我知道在没有公共/受保护的构造函数的情况下,外部客户端不可能对其进行子类化,但不理解术语“多包私有实现类”所传达的内容。

注意:这是有效 Java 中的第 15 条(最小化可变性)。

0 投票
0 回答
43 浏览

java - 使用静态工厂方法的条件调用

这是我的项目结构。我正在尝试使用静态工厂函数来检查对象,然后执行一些操作。我遵循了这个过程。

家长班:

Child1DTO 类

Child2DTO 类:

儿童班:

编辑:

Parent类有一个Child类和两个 DTOChild1DTOChild2DTO.

  1. 我需要在父类或子类中实现条件检查吗?
  2. 如何使用构造函数实现条件检查?
0 投票
1 回答
403 浏览

spring - 使用工厂方法实例化 Spring bean 的原因是什么?

我知道 Spring 中有基于构造函数的注入和基于 setter 的注入。什么时候应该使用工厂方法注入 bean?

0 投票
1 回答
366 浏览

php - 具有继承和类型提示的静态工厂模式

我正在尝试创建一个Developer作为Person.
我希望他们都使用静态工厂模式(或“命名构造函数”)。

我见过这种模式的一些例子,但没有一个使用继承。

问题 1
在示例中,他们使构造函数方法始终为私有。
是否可以对其进行保护以便从子构造函数中调用?
或者我应该解决使构造函数始终私有的问题,并尝试构建create从子create方法调用父方法的继承?

问题 2
当我尝试实例化 Person 或 Developer 类时,我收到以下错误。为什么?

当我删除这: self两种方法中的类型提示时它会起作用create,但我不明白为什么它们不兼容,如果DeveloperPerson.

提前致谢。

0 投票
1 回答
2524 浏览

c# - 正确使用静态工厂方法来创建具有预定义值的 DTO 对象

假设我们必须创建具有一些预定义(默认)值的复杂 DTO 对象。该对象用于序列化,序列化器需要无参数构造函数。为此,我想使用静态工厂方法,但我对这种方法的正确使用有些怀疑。

请考虑以下两个示例:

在第一个示例中,工厂方法仅初始化预定义字段 - 用户必须在对象创建后初始化其余字段。第二个示例初始化预定义的字段,也是必需的字段,但作为缺点,用户必须填写可为空的(在这种情况下不需要,但在其他情况下是必需的)字段flatNumber

我看到了这两种解决方案的优点和缺点,但我正在考虑哪一种更受欢迎以及为什么。也许其他一些方法会更好。我愿意接受任何建议,但我想指出,构建器模式适用的问题并不复杂。

0 投票
3 回答
163 浏览

design-patterns - 工厂模式中是否禁止使用静态方法?

我被告知在实现工厂方法模式时使用静态方法是错误的,应该避免。因为我不太熟悉我接受这个答案的模式。

在阅读文章并深入研究之后,我找不到任何支持这种说法的来源。

有人可以帮我解决这种情况。我应该避免工厂方法中的静态关键字吗?如果是,它们什么时候有用?

0 投票
1 回答
59 浏览

c# - 使用静态工厂模式时如何避免分支?

我在部署静态工厂模式时经常卡在分支中,有没有办法让它比下面的代码更整洁:

0 投票
1 回答
145 浏览

java - 我可以使用超类的类工厂静态方法创建子类实例吗?

问题:

我想扩展 Java 的 java.util。BitSet,使用我自己的MyBitSet,只是为了添加一些我经常使用的功能/转换方法。

我发现在我的代码中真正有用的 BitSet 方法是“类似工厂”的公共静态方法BitSet.valueOf(long[]),所以我希望 MyBitSet 类提供从提供的 long 创建 MyBitSet 实例的相同实用程序[]。

问题是 Java 的 BitSet 没有提供接受 long[] 参数的公共构造函数,所以我不能只使用 super()。

并且 BitSet.valueOf(long[]) 返回一个新的 BitSet 对象,因此由于 ClassCastException,我不能将其转换为 MyBitSet 子类。

此外,BitSet.valueOf(long[]) 方法设置了一些 BitSet 的私有变量,我无法通过 MyBitSet 子类访问这些变量,因此我看不到任何直接复制超类实现的简单方法 - 不好解决方案,但我只是在这里考虑我的选择。

问题:

我可以在 MyBitSet 子类中以某种方式提供这样的功能吗?

一般来说,是否可以利用“类似工厂”的静态方法,如 valueOf(long[]),来创建我自己的子类的实例?

有什么我可能忽略的吗?

我宁愿避免的解决方案:

另一种解决方案是使用 BitSet 的包装类而不是扩展它。

即,一个将 BitSet 实例作为变量并应用我在该 BitSet 变量中需要的附加功能的类。
然而,这种方法现在感觉有点奇怪,如果可能的话,我宁愿扩展 BitSet。

深思熟虑类型的问题:

BitSet.valueOf(long[]) 是一种在特定的初始化状态而不是默认状态下创建新 BitSet 实例的方法。

难道不提供这样的公共构造函数,而只提供“类工厂”的静态方法,实际上是一种预期的模式,以防止开发人员使用它来将自己的子类实例初始化为默认状态之外的状态吗?

如果是这样,为什么?在这种情况下会出现什么问题?

0 投票
1 回答
71 浏览

java - Spring Model类中的java静态工厂方法

在 Spring Model Class 中使用 java 静态工厂方法是否可以通过某种方程来验证字段