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

python - 类工厂生产简单的类似结构的类?

在研究 Ruby 时,我遇到了这个来创建一个简单的类似 Struct 的类:

这对我提出了一些 Python 问题。我已经在 Python 中编写了这个机制的 [非常] 基本克隆:

  1. Python中是否已经有类似的机制来处理这个问题?(我通常只使用字典)。

  2. 我将如何获得Struct()创建正确__init__()参数的函数。(在这种情况下,如果可能,我想执行person1 = Person('John', 'Doe')命名参数:person1 = Person(surname='Doe', forename='John')

出于兴趣,我希望回答问题 2,即使有更好的 Python 机制来执行此操作。

0 投票
2 回答
626 浏览

c# - 使用来自基类的静态方法实例化继承的类

我有一个抽象基类,其中有许多继承的类。我想做的是一个静态成员接受一个字符串,第一个可以解析字符串的类(只有一个继承的类应该能够)并返回继承类的实例。

这就是我目前正在做的事情。

我想要它,这样我的代码会检查所有继承的类,而不会让未来的程序员在添加更多继承的类时回来编辑这个函数。

有没有办法可以强制继承的类实现自己的GenerateCommand(string)

public static abstract Epl2Command GenerateCommand(string command)不是有效的 C#。或者当我应该使用锤子时,我是在用鞋钉钉子吗?做这个类工厂的任何更好的方法将不胜感激。

0 投票
2 回答
312 浏览

java - 如何将类工厂的依赖关系反向移动到库

determineSubClass当所有涉及的类都在同一个项目中(是 的成员)时,以下代码可以很好地工作BaseClass

但现在,我想将 移动BaseClass到一个共享库项目,其中SubClassOneSubClassTwoSubClassThree没有SubClassFour在库中定义,而是在使用该库的应用程序中定义。

我当然可以BaseClass回到使用这个库的每个应用程序,但我想知道:

  • 有更好的解决方案吗?
  • 有没有一种解决方案可以让我保留BaseClass在 Library 项目中并消除它了解从它派生的所有超类的需要?

编辑(回答下面的@ahmet alp balkan 问题):

ofType()每个子类做两件事:

  1. 根据 String p1 的内容和其他参数 p2 和 p3 确定要实例化的子类是否属于它的类型。
  2. 如果答案是肯定的,它会实例化一个 self 子类的对象。否则,返回 null。

至于您的第二个问题,BaseClass此时所有子类都拥有公共数据成员和方法,并且只有这个静态方法旨在委派确定要实例化的子类的责任。

顺便说一句,多亏了你的问题,我注意到我原来的帖子中有一个可怕的错字:“SuperClassOne”应该是“SubClassOne”等。

0 投票
5 回答
1822 浏览

python - 使用工厂与常规构造函数的优缺点

(使用 Python 3.2,尽管我怀疑它是否重要。)

我有class Data,class Rules和 类Result。我使用小写字母来表示类的一个实例。

对象包含规则,如果rules应用于data对象,则可以创建result对象。

我正在决定将实际将规则应用于数据的(相当复杂和不断发展的)代码放在哪里。我可以看到两个选择:

  1. 将该代码放在类Result方法中,例如parse_rules. Result构造函数会将对象作为参数rules,并将其传递给self.parse_rules.

  2. 将该代码放入一个新类ResultFactory中。ResultFactory将是一个单例类,它有一个方法,say build_result,它rules作为参数并返回一个新建的result对象。

这两种方法的优缺点是什么?

0 投票
1 回答
2375 浏览

python - 类工厂和抽象基类

我正在尝试基于抽象基类定义许多类。这些类中的每一个基本上都为可视化包定义了一个单元格形状。单元由许多顶点(点)组成,每个子类将需要不同数量的点。每个类都可以被认为是固定数量的点坐标的容器。

例如,考虑基类Shape,它只是一个坐标列表的容器:

理想情况下,我希望能够定义一个Square类,其中points.setter方法检查sequence的长度为 4。此外,我希望用户无法实例化Shape. 有没有办法可以定义Shape为抽象基类?我尝试将形状的定义更改为以下内容:

这需要子类来定义属性npoints。然后我可以将一个类定义Square

但是,对于大量子类(并且要实现多个属性),这将是相当乏味的。我希望定义一个类工厂来为我创建我的子类,类似于:

这个类工厂函数是一种有效的方法,还是我破坏了这个npoints属性?将调用替换为type更详细的内容是否更好,例如:

另一种方法是定义一个类属性_NPOINTS并将npoints 属性更改Shape

但是,我失去了使用抽象基类的好处,因为:

  • 我看不到如何使用type, 和
  • 我不知道如何定义抽象类属性。

有没有人对实现这个抽象基类和类工厂函数的最佳方式有任何想法,甚至是一个更好的设计?

0 投票
3 回答
474 浏览

apache-flex - Flex ItemRenderers

我知道 ItemRenderer 是 ClassFactory,您可以使用 ClassFactory 的 newInstance 方法来获取 ItemRenderer 的实例。但是,我的问题是,是否可以在不使用 ClassFactory.newInstance() 的情况下使用 ItemRenderer 的方法?

在我的情况下,我不能使用这个 newInstance 方法,因为它不保持状态。

有什么办法可以做到这一点吗?谢谢!

0 投票
4 回答
1833 浏览

python - Python - 如何强制使用工厂方法来实例化对象?

我有一组相关的类,它们都继承自一个基类。我想使用工厂方法来实例化这些类的对象。我想这样做是因为我可以在将对象返回给调用者之前将对象存储在由类名键入的字典中。然后,如果有对特定类的对象的请求,我可以检查一个对象是否已经存在于我的字典中。如果没有,我将实例化它并将其添加到字典中。如果是这样,那么我将从字典中返回现有对象。这实际上会将我模块中的所有类变成单例。

我想这样做是因为它们都继承自的基类对子类中的函数进行了一些自动包装,而且我不希望函数被多次包装,如果两个对象当前会发生这种情况创建相同的类。

我能想到的唯一方法是检查__init__()基类方法中的堆栈跟踪,该方法将始终被调用,如果堆栈跟踪未显示创建对象的请求来自工厂功能。

这是一个好主意吗?

编辑:这是我的基类的源代码。有人告诉我,我需要找出元类来更优雅地完成这项工作,但这就是我现在所拥有的。所有 Page 对象都使用相同的 Selenium Webdriver 实例,该实例位于顶部导入的驱动程序模块中。这个驱动程序的初始化成本很高——它在第一次创建 LoginPage 时被初始化。初始化后,该initialize()方法将返回现有驱动程序而不是创建新驱动程序。这个想法是用户必须从创建一个 LoginPage 开始。最终将定义数十个 Page 类,它们将被单元测试代码用于验证网站的行为是否正确。

如果一个页面被实例化了几次,这没什么大不了的——这些方法只会被包装几次,并且会发生一些不必要的检查,但一切仍然有效。但是如果一个页面被实例化几十、几百或几万次,那就不好了。我可以在每个页面的类定义中放置一个标志并检查方法是否已经被包装,但我喜欢保持类定义纯净和干净并将所有 hocus-pocus 推入深角落的想法我的系统没有人可以看到它,它只是工作。

0 投票
4 回答
3372 浏览

c# - 如何使类工厂创建所需的派生类

我经常使用类工厂模式,其中一个类有一个私有构造函数和一个静态方法来创建类。这允许由于某种原因无法构造类并返回 null 的情况 - 非常方便。

我希望能够将其扩展到工厂方法,该方法根据条件从派生类的层次结构中创建特定类。但是我看不到隐藏派生类的构造函数以强制使用工厂方法的方法。如果工厂方法在基类中,则它不再有权访问派生类的私有构造函数。在每个派生类中放置工厂方法是行不通的,因为必须事先知道所需的类型。如果一个类可以访问嵌套类的私有成员,则嵌套类可能是一种方式,但遗憾的是,嵌套类似乎可以访问封闭类的私有成员,但反之则不行。

有谁知道这样做的方法?

0 投票
0 回答
432 浏览

c# - 用于托管进程内服务器的自定义 COM 类工厂

我正在考虑为托管类库实现自定义 COM 激活逻辑, MkParseDisplayName/BindToObject .

这样,从 VB 创建对象可能如下所示:

CoRegisterClassObject对于进程外服务器(使用)来说,这不是问题。但是,对于进程内服务器,我需要更改 的实现DllGetClassObject,这通常由mscoree.dll. 这可能吗?

我看到的唯一其他选择是创建一个C# 单例对象作为类工厂并在其上实现IParseDisplayName。理论上,这样的单例也可以注册一个自定义IClassFactory类对象CoRegisterClassObject(CLSCTX_INPROC_SERVER),但无论如何,单例本身需要先实例化。

0 投票
2 回答
75 浏览

python - 从生成的类继承的文档函数

我有一个类工厂,它生成一个具有绑定到另一个类的函数的类。当一个类从生成的类继承时,它会获得适当的功能。现在我想记录生成的类的函数,否则必须检查类工厂以查看该函数的作用,或者类工厂的文档必须描述所有生成的类的函数。

类工厂:

它的用法:

现在,当 Sphinx 记录这一点时,很明显GreetArthur继承自Greeter,但Greeter从未记录,因为它是生成的。因此,从文档中不清楚GreetArthur具有 function greet

期望的结果: