问题标签 [factory-method]

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 回答
1255 浏览

design-patterns - 工厂方法UML图说明

我正在经历这里描述的工厂方法模式。我不太明白标记 from ApplicationtoDocument和 from MyApplicationto的箭头的含义MyDocument。谁能帮助我理解这个符号。

替代文字

0 投票
2 回答
149 浏览

castle-windsor - 使用 Castle 的 UsingFactoryMethod() 注册组件时如何获取依赖的类型?

我在为我的 Castle Windsor 容器设置正确的绑定方面有点挣扎。最初的问题涉及 log4net 和命名记录器,可以在这个问题中找到描述:设置 log4net 记录器的名称

但是,现在问题缩小到了这一点:

我有一个实现 IAuditor 的类 Log4NetAuditor。我的一些类扩展了我的抽象类 AuditableComponent,它具有 IAuditor 类型的属性 Auditor。当我用 Castle 注册 IAuditor 时,它知道如何为所有扩展 AuditableComponent 的类解析和设置 Auditor。

现在,我需要 Log4NetAuditor 的构造函数来获取 Type 参数。该类型应该是扩展 AuditableComponent 的类的类型。我试图通过工厂方法实现这一点,但我无法解决:

我对这个问题视而不见。任何人都可以帮忙吗?

0 投票
2 回答
1055 浏览

c++ - 工厂方法模式

工厂方法到底是什么?怎么用dll实现呢?

0 投票
11 回答
202400 浏览

c++ - 如何在 C++ 中正确实现工厂方法模式

在 C++ 中有一件事情让我感到很不舒服很长一段时间,因为老实说我不知道​​该怎么做,即使它听起来很简单:

如何在 C++ 中正确实现工厂方法?

目标:允许客户端使用工厂方法而不是对象的构造函数来实例化某些对象,而不会产生不可接受的后果和性能损失。

“工厂方法模式”是指对象内部的静态工厂方法或在另一个类中定义的方法或全局函数。只是一般“将类 X 的常规实例化方式重定向到构造函数以外的任何地方的概念”。

让我浏览一下我想到的一些可能的答案。


0)不要制造工厂,制造构造器。

这听起来不错(实际上通常是最好的解决方案),但不是一般的补救措施。首先,在某些情况下,对象构造是一项复杂到足以证明将其提取到另一个类的任务。但是即使把这个事实放在一边,即使对于简单的对象来说,只使用构造函数通常也行不通。

我知道的最简单的例子是二维向量类。如此简单,却又很棘手。我希望能够从笛卡尔坐标和极坐标中构建它。显然,我不能这样做:

我的自然思维方式是:

哪个,而不是构造函数,导致我使用静态工厂方法......这本质上意味着我正在以某种方式实现工厂模式(“类成为它自己的工厂”)。这看起来不错(并且适合这种特殊情况),但在某些情况下会失败,我将在第 2 点中进行描述。请继续阅读。

另一种情况:试图通过某些 API 的两个不透明 typedef 重载(例如不相关域的 GUID,或 GUID 和位域),语义上完全不同的类型(因此 - 在理论上 - 有效重载)但实际上结果是同样的事情——比如无符号整数或空指针。


1)Java方式

Java 很简单,因为我们只有动态分配的对象。制造工厂很简单:

在 C++ 中,这转换为:

凉爽的?确实,经常。但是,这迫使用户只使用动态分配。静态分配使 C++ 变得复杂,但也常常使它变得强大。另外,我相信存在一些不允许动态分配的目标(关键字:嵌入式)。这并不意味着这些平台的用户喜欢编写干净的 OOP。

无论如何,抛开哲学:在一般情况下,我不想强​​迫工厂的用户被限制为动态分配。


2) 按值返回

好的,所以我们知道 1) 在我们想要动态分配时很酷。为什么我们不在此之上添加静态分配?

什么?我们不能通过返回类型重载?哦,我们当然不能。因此,让我们更改方法名称以反映这一点。是的,我编写了上面的无效代码示例只是为了强调我多么不喜欢更改方法名称的需要,例如因为我们现在无法正确实现与语言无关的工厂设计,因为我们必须更改名称 - 和此代码的每个用户都需要记住实现与规范的差异。

好的......我们有它。这很难看,因为我们需要更改方法名称。这是不完美的,因为我们需要编写两次相同的代码。但是一旦完成,它就会起作用。对?

嗯,通常。但有时它不会。在创建 Foo 时,实际上是依赖编译器为我们做返回值优化,因为 C++ 标准已经足够仁慈了,编译器厂商不会指定何时就地创建对象,返回一个对象时何时复制它。 C++ 中按值的临时对象。因此,如果 Foo 的复制成本很高,那么这种方法是有风险的。

如果 Foo 根本不可复制怎么办?嗯,呵呵。(请注意,在保证复制省略的 C++17 中,对于上面的代码,不可复制不再是问题

结论:通过返回对象来制造工厂确实是某些情况下的解决方案(例如前面提到的二维向量),但仍然不是构造函数的一般替代品。


3)两期建设

有人可能会想出的另一件事是将对象分配和初始化的问题分开。这通常会导致如下代码:

人们可能会认为它就像一种魅力。我们在代码中付出的唯一代价......

既然我已经写了所有这些并把它作为最后一个,我也必须不喜欢它。:) 为什么?

首先……我是真心不喜欢两期建设的概念,用起来有愧疚感。如果我用“如果它存在,它处于有效状态”的断言来设计我的对象,我会觉得我的代码更安全,更不容易出错。我喜欢这样。

不得不放弃那个约定并改变我的对象的设计只是为了制造它的工厂......好吧,笨拙。

我知道以上不会说服很多人,所以让我给出一些更扎实的论据。使用两阶段构造,您不能:

  • 初始化const或引用成员变量,
  • 将参数传递给基类构造函数和成员对象构造函数。

可能还有一些我现在无法想到的缺点,而且我什至不觉得特别有义务,因为上述要点已经说服了我。

所以:甚至没有一个很好的通用解决方案来实现工厂。


结论:

我们希望有一种对象实例化的方式,它会:

  • 无论分配如何,都允许统一实例化,
  • 为构造方法赋予不同的、有意义的名称(因此不依赖于参数重载),
  • 不会引入显着的性能损失,最好是显着的代码膨胀损失,尤其是在客户端,
  • 是一般的,如:可能被引入任何类。

我相信我已经证明我提到的方法不能满足这些要求。

有什么提示吗?请给我一个解决方案,我不想认为这种语言不允许我正确实现这样一个微不足道的概念。

0 投票
2 回答
2888 浏览

c# - C#中的工厂方法模式

class A工具IC
class B工具IC

class Factory有方法GetObject(int x)x=0对于A,x=1对于B.

如何强制使用Factory.GetObject方法来创建类型的对象AB防止类似的东西new A(),应该是Factory.GetObject(0)

0 投票
22 回答
255303 浏览

factory-pattern - 抽象工厂和工厂设计模式有什么区别?

我知道有很多关于这两种模式之间差异的帖子,但有一些我找不到。

从我一直在阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但对客户隐藏实现,因为他们将看到通用产品。我的第一个问题是关于抽象工厂的。它的作用是允许您在其中创建具体对象系列(这可能取决于您使用的特定工厂),而不仅仅是单个具体对象?抽象工厂是否只返回一个非常大的对象或许多对象,具体取决于您调用的方法?

我的最后两个问题是关于一个我无法完全理解的单引号,我在很多地方都看到过:

两者之间的一个区别在于,对于抽象工厂模式,一个类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式使用继承并依赖子类来处理所需的对象实例化。

我的理解是工厂方法模式有一个 Creator 接口,这将使 ConcreteCreator 负责知道要实例化哪个 ConcreteProduct。这就是使用继承来处理对象实例化的意思吗?

现在关于那句话,抽象工厂模式究竟是如何通过组合将对象实例化的责任委托给另一个对象的?这是什么意思?看起来抽象工厂模式在我看来也使用继承来完成构建过程,但我仍然在学习这些模式。

任何帮助,尤其是最后一个问题,将不胜感激。

0 投票
1 回答
13285 浏览

java - 自动装配由 EasyMock 工厂方法生成的 bean?

我有一个对我来说似乎很奇怪的问题。我有以下设置:

一个接口:

一个弹簧组件:

带有由 EasyMock 生成的模拟 bean 的弹簧测试配置:

还有一个单元测试:

项目编译并且测试通过没有任何问题,即SomeClass(一个“真实”对象)和SomeDependency(一个由 EasyMock 生成的模拟对象)的自动装配成功。

但是,如果我将SomeClass的实现更改为:

两个测试都失败了,因为

所以我的问题是:

  1. 为什么 Spring 无法将依赖项自动连接到SomeClass(当它成功地将相同的依赖项自动连接到SomeClassTest时)?
  2. 如何更改SomeClassTesttestconfig.xml以使测试通过?

评论:实际上SomeClass所代表的类是框架的一部分。因此,它不能轻易更新,至少不能在合理的时间内更新。

依赖项:

  • 春天:3.0.5.RELEASE
  • 易模拟:3.0

编辑:

从 Spring 3.2 RC1 开始,解决了泛型工厂方法和模拟对象的问题

/马蒂亚斯

0 投票
4 回答
62416 浏览

java - Spring并在运行时将参数传递给工厂方法

方法 context.getBean(name, user) 的文档说

允许指定显式构造函数参数/工厂方法参数

但无论我做什么(尝试了一切),最合乎逻辑的设置是在初始化期间加载 bean 时得到这个:



评论说你可以做到,但如果你在该 bean 的 xml 定义中指定构造函数参数,它会失败。

0 投票
2 回答
257 浏览

c# - 好的源代码可以让我在 c# 上的工厂设计模式上抢占先机

我觉得我应该开始在我的一些代码上使用工厂方法设计模式。这就是我正在做的事情;

下面的代码是我的 Accom 命名空间的生成器类:

我也会对 Traf 命名空间进行相同的启动:

因此,这将一次又一次地重复。

我试图为此创建一些工厂模式,但是所有的抽象类都是混合的,我很困惑(我认为这是因为这是我第一次尝试做类似的事情)。

任何人都可以在这方面帮助我并指出我可以阅读并从中理解的好的源代码吗?

0 投票
8 回答
7743 浏览

design-patterns - 工厂方法设计模式

根据书:

工厂模式的本质是“定义一个用于创建对象的接口,但让子类决定实例化哪个类。工厂方法让一个类将实例化推迟到子类。

假设我有一个 Creator 课程:

好的,这是我的 Creator 课程,但我不明白

Factory 方法允许类将实例化推迟到子类

它与子类有什么关系?我应该使用子类做什么?

任何人都可以给我一些例子吗?