问题标签 [class-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 投票
0 回答
459 浏览

com - DllGetClassObject is not exported, (so is never called and interface is never found)

I am trying to write a COM server and client. When I call CoCreateInstance(), COM Engine is expected to call DllGetClassObject(), but it seems it is never called(I have put simple message box before all other functionality, so I am sure it is not called).

On further inspection, I found that it is not exported. I tested it using Dumpbin /EXPORTS

My def file is

I don't know why these are not exported. I can not use __declspec(dllexport) for known reason, there is other way of using #pragma but I am quite ready to write .def file, but don't know why functions are not getting exported.

0 投票
3 回答
851 浏览

c++ - C++:如何在启动时创建类的集合

我正在使用 C++ 11。我有 N 个源文件,每个源文件都包含一个从公共基类继承的类。在启动时,我希望每个类都将自己注册到一个集合中。注册将包括 1) 识别类目的所需的数据,2) 用于创建类实例的类工厂。源文件的数量未知。这样做的模式是什么?该解决方案需要与 Visual Studio 2013、gcc 等跨平台兼容。

0 投票
1 回答
92 浏览

objective-c - UIColoror 类工厂方法 - 它们何时发布

我正在阅读作为设计模式的objective-c中的类工厂方法,并且有些困惑。为简单起见,我使用 UIColor 作为我的问题示例,但如果其他类工厂方法有所不同,请告诉我。基本概念:

我知道这结合了分配和初始化。我读过的一些文档在自动引用计数之前是较旧的,并且指的是它是使用自动释放制作的(我不熟悉没有使用 MRC 的东西)。我试图了解这与自动引用计数和单例有何关系。例如,如果我这样做:

我是否只保留一个对象,有点像单身人士?

什么时候发布?当所有由 whiteColor 组成的对象超出范围或设置为零时?

我提到了创建新实例的类方法,但有些答案是指 ARC 而有些不是。

上述线程中的最终答案说:

“使用 ARC 和最新编译器的现代方法是:

无需使用 ARC 自动释放。”

我只是不清楚这个自动发布意味着什么。我阅读了一些苹果文档,他们表示这是图片的一部分。通过上面的例子,如果这是真的,如果这是真的,它将创建变量的多个实例。该方法是一个类方法,但上面的代码暗示它不是静态赋值。

这就是类工厂方法的全部含义吗?它像任何其他初始化一样返回一个对象,但它是一个静态或类方法,它结合了分配和初始化?自动释放如何发挥作用?我很难理解为什么它不能只为所有对象创建一种白色来共享。这似乎更有效率。但是让我问这个问题的原因是要了解类工厂方法的设计模式以及它显然是以一种或另一种方式完成的。

ARC 和 autorelease中,最佳答案是“ARC 仍然使用 Autorelease 作为一种机制,此外 ARC 编译代码旨在与 MRC 编译代码无缝互操作,因此自动释放机制就在身边。” 所以我仍然想知道如果我为两个对象要求两次 whiteColor 是否有一两个副本。以及什么时候发布。在上面的代码示例中,它似乎是一个像其他任何对象一样的对象,但在上面的帖子中它不同。

上述线程中的第二个答案说“自动释放用于返回的函数对象,因此调用者不拥有所有权,被调用者将在未来释放该对象。” 那么这里的动机又是什么?UIColor 类是否希望所有被调用者只有一个对象?这个因素如何融入类工厂设计模式?

UIColor 的类参考https://developer.apple.com/Library/ios/documentation/UIKit/Reference/UIColor_Class/index.html只是说函数 whiteColor:“返回值 UIColor 对象。”

我没有在那里找到答案。

在做更多研究时,我看到“类工厂方法的另一个目的是确保某个类(例如 NSWorkspace)提供单例实例。” https://developer.apple.com/library/ios/documentation /General/Conceptual/CocoaEncyclopedia/ClassFactoryMethods/ClassFactoryMethods.html

这是进一步研究的结果。我打算将任何其他问题移至另一个帖子。

0 投票
0 回答
47 浏览

c++ - Windows 中静态对象的初始化(用于类工厂)

我正在编写一个类工厂(在 Visual Studio 2008 中),其中类正在注册自己。类工厂是一个单例,类注册自己是这样的:

在工厂.h

在 SomeRegisteredClass.cpp

然而,在运行时,Register 的构造函数永远不会被调用,因此 SomeClass 永远不会被注册。我怀疑正在进行一些优化来优化 SomeRegisteredClass.cpp 中的内容(因为 SomeClass 没有直接在代码中的其他任何地方使用,而只能通过其接口使用)。可能是这样,我该如何禁用它。

Edit1:所有这些东西都被编译成一个静态库,该库链接到一个可执行文件。

0 投票
5 回答
688 浏览

c++ - 我可以为带参数的构造函数创建类工厂吗?

我正在使用类工厂来动态创建对象。我使用这个答案是因为它的简单性(并且因为我使用的是 Qt)。

但现在我意识到我必须为我的构造函数添加一个参数

代替

对于参考答案中的代码:

我注册了班级

需要的时候,我打电话

我试图在类工厂中添加一个额外的参数来表示构造函数参数,但我的尝试都导致错误。

为什么我需要它:简单案例:

  • 创建一个新对象 - 设置默认值;对于某些对象,它需要一个打开文件对话框,因为必须从文件中加载数据。

  • 加载对象 - 填充数据,包括包含文件信息的对象的文件名

为了能够调用“加载”函数,必须存在一个对象——这意味着如果我创建一个新对象,即使我不需要它,我也会触发一个打开文件对话框。

我看到的解决方法是有一个构造函数,然后是一个设置函数。但是......这意味着构造一个对象总是需要一个 2 函数调用,这似乎是一个糟糕的设计。

这就是为什么我正在寻找一种使用简单调用来注册和调用类的方法,例如

有可能吗,我该怎么做?

0 投票
2 回答
74 浏览

c# - 受限类工厂设计模式

是否有一种优雅的(或任何)方法可以在 C# 中实现以下目标?

  • 让我们有一个不允许直接实例化(非公共构造)的类ItemBase(进一步可派生为Item1, ...) - 以防止用户创建任何“未跟踪”的.Item2Item*
  • 让我们有一个非静态类Manager,它的实例(允许多个)只能创建和提供实例Item*(因为它们会跟踪生成的实例并做一些额外的工作)。
  • 让我们有一个可选要求:Manager实例想要操纵托管Item实例的非公共成员(类似于Managera friendof Item*)。
  • 如果Manager不强迫 是 的推导,那就太好了Item*
  • 如果反射越少越好。

笔记:

  • 如果可能,请将此视为思考如何以最佳和优雅的方式实施特定问题解决方案的过程中提出的问题。我希望它是通用的,不,我没有资源,是的,我已经尝试了一些变体,但没有一个能满足我的需求。谢谢你。

  • 据我所知,没有可接受friend的替代方法(任何一种似乎都很好),所以internal只是提供了“特殊”(但公开)的修改方法,用户必须知道,这些方法不适合他:o (InternalsVisibleToAttributeItemBase

  • 我喜欢这个解决方案,但我无法发明如何允许多个Manager实例使用它。

0 投票
0 回答
208 浏览

c++ - 创建一个通用类工厂来测试 GoogleTest 中的动态类创建/销毁?

当我玩弄谷歌测试时,我遇到了一个难题。

我想对一个 C++ 类进行单元测试,该类基于来自外部系统的事件,将产生新的类来与系统中来来往往的实体对话。事件调度程序以及如何为专门的实体创建类都由我无法控制或更改的库决定。该库的设计要求我将某些参数传递给类构造函数关于如何连接到实体,如果该实体不存在,构造函数将抛出。由于将根据它们的存在和事件使用这些类,因此我希望能够EXPECT_CALL()使用它们的方法。我显然需要一个可以模拟或以其他方式重载并返回模拟类而不是真实类的工厂。

我已经将事件监视器抽象为 IClass,以便我可以创建它的 Mock 并以受控方式提供事件。我创建了一个具有一系列 Construct[x] 方法的工厂,其中每个方法std::shared_ptr为特定 IClass 的新实例返回一个。这很好用,我可以在我想以这种方式测试的类上运行一个完整的测试套件。包括适当的类破坏。

但是,我希望我的工厂更通用,我能想到的最好的方法是:

我想测试的类,将使用类工厂,在测试类编译时已经编译成一个目标文件,所以上面的模板工厂显然不会工作。该模板已被评估,并且测试类中没有任何形式的模板专业化将重新路由来自我要测试的类的 Construct 调用。

所以我的问题是:是否有可能为此创建一个通用工厂?如果是,我会怎么做?

在此先感谢您的帮助!

0 投票
1 回答
211 浏览

python - 动态创建一个类而不实例化它 - 没有元类?

以 WTForms 表单定义类为例:

并查看库的源代码,似乎 WTForms 允许用户定义一个非常简单的自定义表单结构类(如上),然后用于构造一个新的字段类,该类在类被实例化时不会被实例化生成。

我已经阅读了许多关于类工厂和元类的教程,普遍的共识是避免使用元类,而是使用类装饰器之类的东西。问题是教程要么开始导入额外的库,例如:import six混合不同 Python 版本的解释,使用过于复杂的示例,要么建议根本不要使用元类。

请有人提供一个非常简单的解释(对于 Python 3),说明如何使用简单的类定义(如上面的 WTForms 示例)以及元类来自定义类的全新构造,而无需在构造类时实际实例化类。

编辑:很抱歉很难解释我的最终目标是什么,但是当我浏览教程时,我不清楚类装饰器、元类、魔术方法(callnewinit)或这些方法的组合是什么需要实现我所想象的,或者我所想象的是否是错误的做事方式。不幸的是,如果不了解实现目标所需的机制,似乎无法判断我的目标是否错误。我已经意识到元类是要走的路,只需要为一个非常简单的元类示例指明正确的方向,以 Python 3.x 的方式完成。

0 投票
0 回答
133 浏览

swift - 如何在 Swift 中实现泛型类工厂?

我想“制作”一些类似于基类但基础类型不同的类实例。(与网上看到的典型“动物”类工厂示例不太一样!)

下面的代码接近工作,但它需要用户“向上转换”make结果,如下所示:

除了 FOO 之外,我不希望用户知道特定的类类型。我看过其他建议,它们都表明解决方案是使用符合协议的泛型类型定义 make,如下所示:

但是,这给了我在调用 FOO.make(version: FOO.Ver.f1) 时出现的错误“无法推断通用参数'T'”

有人知道怎么做吗?我的游乐场代码如下。

0 投票
2 回答
148 浏览

r - 带有 ifelse() 的双 for 循环在 R 中无法正常工作

我正在尝试遍历数据框的每一列并将“未知”值转换为 NA。我尝试了以下代码:

但是,它没有改变任何值。我试图改变的列是因素,所以我也试过:

无济于事。没有获得错误,代码似乎运行没有问题;只有值保持为“未知”。