到底什么是类工厂?

2023-12-15

我经常看到这个词被抛出,随着时间的推移,我自己可能在代码和库中使用过它,但我从未真正理解它。在我遇到的大多数文章中,他们只是继续期待你能弄清楚。

什么是类工厂?有人可以解释这个概念吗?


以下是一些补充信息,可能有助于更好地理解其他几个较短但技术上正确的答案。

从最严格的意义上讲,类工厂是一个函数或方法,它根据输入参数或全局上下文确定的某些条件创建或选择一个类并返回它。当type直到运行时才能确定所需对象的数量。当类本身就是所使用语言(例如 Python)中的对象时,可以直接完成实现。

Since the primary use of any class is to create instances of itself, in languages such as C++ where classes are not objects that can be passed around and manipulated, a similar result can often be achieved by simulating "virtual constructors", where you call a base-class constructor but get back an instance of some derived class. This must be simulated because constructors can't really be virtual in C++, which is why such object—not class—factories are usually implemented as standalone functions or static methods.

Although using object-factories is a simple and straight-forward scheme, they require the manual maintenance of a list of all supported types in the base class' make_object() function, which can be error-prone and labor-intensive (if not over-looked). It also violates encapsulation✶✶ since a member of base class must know about all of the base's concrete descendant classes (now and in the future).

Virtual functions are normally resolved "late" by the actual type of object referenced, but in the case of constructors, the object doesn't exist yet, so the type must be determined by some other means.
✶✶ Encapsulation is a property of the design of a set of classes and functions where the knowledge of the implementation details of a particular class or function are hidden within it—and is one of the hallmarks of object-oriented programming.

因此,最好/理想的实现是那些可以处理新候选类的实现自动地添加它们时,而不是仅将某个有限集硬编码到工厂中(尽管这种权衡通常被认为是可以接受的,因为工厂是唯一需要修改的地方)。

James Coplien 1991 年出版的书高级 C++:编程风格和习惯用法详细介绍了在 C++ 中实现此类虚拟泛型构造函数的一种方法。还有更好的方法可以使用C++ 模板,但这在本书中没有涉及,这早于它们被添加到标准语言定义中。事实上,C++ 模板本身就是类工厂,因为每当使用不同的实际类型参数调用它们时,它们都会实例化一个新类。Update:我找到了 Coplien 1998 年为 EuroPLoP 撰写的一篇论文,标题为C++ 习语除其他外,他将书中的习语修改并重新组合成 1994 年的设计模式形式设计模式:可重用的面向对象软件的元素书。特别注意虚拟构造函数部分(使用他的信封/信件模式结构)。

另请参阅此处问题的相关答案Python 中的类工厂以及 2001 年 Dobb 博士关于使用 C++ 模板实现它们的文章,标题为抽象工厂,模板风格.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

到底什么是类工厂? 的相关文章

  • 如何在课外使用$this?

    我们可以使用 this课外 请看下面的例子
  • 列出类的所有实例

    我编写了一个 Python 模块 其中有几个类继承自一个名为MasterBlock 我想在脚本中导入此模块 创建这些类的多个实例 然后获取该类的所有子级的所有现有实例的列表MasterBlock班级 我找到了一些解决方案vars Block
  • 封装的闭包与类?

    我是 JS 来自 C etc 的新手 我突然想到闭包似乎是比类更简单 更方便的处理封装的方法 这段代码似乎给出了一种处理封装的简单方法 function addProperty o var value o get function retu
  • 为什么我不能将一个类划分为多个文件

    我正在尝试创建一个类TestClass它分为几个文件 我将它分成 3 个文件 其中第一个文件TestClassPart1 php已经开始上课了class TestClass 和最后一个文件TestClassPart3 php有班级的右括号
  • java中有没有更好的方法来获取当前类变量?

    现在我正在做这样的事情 private static Logger logger LoggerFactory getLogger MasterController class 有没有比使用类名称 MasterController 更好的方法
  • 初始化父类时如何返回子类的新实例?

    给定一个类层次结构如下 class A def initialize param if param 1 then initialize and return instance of B else initialize and return
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • 为什么可以从 console.log 访问 JavaScript 私有方法

    我写了一个简单的代码 const secure new class privateProperty 4 privateMethod console log The property this privateProperty should n
  • C# 中的类和模块有什么用

    有人可以解释一下类和模块之间的区别吗 你什么时候使用其中一种而不是另一种 我正在使用 C 更新 我的意思是相当于 VB 模块的 C 版本 这在很大程度上取决于您所指的 模块 Visual Basic 的模块 C 中没有真正等效的 VB Ne
  • 如何为带有继承的 C++ 类编写 C 包装器

    我只是想知道是否有一种方法可以为具有继承的 C 类创建 C 包装 API 考虑以下 class sampleClass1 public sampleClass public int get return this data 2 void s
  • JavaScript - 类根据条件扩展

    事情是这样的 我有一个名为 A 的主课 我希望这个班级能够扩展 B 级 class A extends B 但事实上 我希望 B 类在特定条件下扩展 C D 或 E class B extends B1 or class B extends
  • 如何在 Angular 2 应用程序中从 TypeScript/JavaScript 中的字符串获取类?

    在我的应用程序中 我有这样的内容 user ts export class User 现在 我这样做 应用程序组件 ts callAnotherFunction User 如果我将类名作为字符串 即 我该如何做到这一点 User 如果可能的
  • 使用 jQuery 更改 CSS 类属性

    有没有办法使用 jQuery 更改 CSS 类的属性 而不是元素属性 这是一个实际的例子 我有一个 div 类red red background red 我想转班级red背景属性 而不是具有类的元素red分配的背景 如果我用 jQuery
  • Android/Java 创建辅助类来创建图表

    Goal 创建用于图形生成的辅助类 背景 我有 3 个片段 每个片段收集一些传感器数据 加速度计 陀螺仪 旋转 并使用 GraphView 绘制图表 以下是其中一个片段的代码 该代码当前工作正常 public class Gyroscope
  • 调用类实例方法 onclick javascript

    我有一个 javascript 文件 其中包含包含方法函数的类 我想知道如何从 onClick 事件调用类实例方法 function MyClass this instanceData Display Me this DisplayData
  • PHP - 扩展 __construct

    我想知道你是否可以帮助我 我有两个类 一个扩展了另一个 B 类将由各种不同的对象扩展 并用于常见的数据库交互 现在我希望 B 类能够处理其连接和断开连接 而无需来自 A 类或任何外部输入的指示 据我了解 问题是扩展类不会自动运行其 cons
  • 为什么我无法访问打字稿类的构造函数中的抽象属性

    abstract class Route abstract readonly name string protected abstract pattern string public constructor Do something wit
  • 无法从 C# WPF 中的另一个窗口调用方法

    好吧 假设我有两个窗户 在第一个中我有一个方法 public void Test Label Content works 在第二个方法中 我称此方法为 MainWindow mw new MainWindow mw Test 但什么也没发生
  • 类方法作为 JavaScript 中的事件处理程序?

    JavaScript 中是否有最佳实践或通用方法将类成员作为事件处理程序 考虑以下简单示例
  • 无法实例化类对象的类型 (Java)

    这是我收到错误的代码 在 new 之后的第二个 Killer 处 String classes new String 5 kills 0 Brian Moser kills 1 James Doakes kills 2 Lila Tourn

随机推荐

  • 如何使 CSS 网格中的图像彼此相邻并在空间不足时跳转到另一行

    我正在尝试使用 CSS 网格按照图片中所示的方式定位图像 但找不到正确的解决方案 现在 我只是将网格流更改为列 但是网格元素在遇到容器末尾时不会跳转到另一行 它们会调整其大小并保留在相同的第一行中 我尝试使用grid template co
  • 当编辑行中的单元格时,如何更改谷歌电子表格行颜色?

    我已经尝试过这个 当单元格更改文本时更改行颜色的脚本但它无法让它发挥作用 该行的颜色不会更改为 000000 这是我到目前为止所拥有的 function onEdit event var ss event source getActiveS
  • 使用perl的`系统`

    我想运行一些命令 例如command 使用perl的system 认为command从 shell 运行如下 command arg1 arg1 arg2 arg2 arg3 arg4 我该如何使用system to run command
  • OpenAPI 3.0 - oneOf 内的 allOf

    以下 YAML openapi 3 0 0 info title test version 1 0 0 paths test get summary test responses 200 description Test content a
  • 不允许的内容类型:Struts 2 中的 fileUpload

    我是 Struts 2 的新手 正在尝试使用fileUpload拦截器 我正在附加所有代码层 动作类 FileUploadAction package com caveofprogramming actions import java io
  • 将一张工作表的内容和样式克隆到另一张工作表 - PHP Excel

    我需要将 Excel 工作簿中一张工作表的内容复制到新 Excel 工作簿中的一张工作表 问题是 我不知道这些工作表包含什么或其格式 但是 每次都只是第一张 我尝试过一种方法 但每次都会耗尽内存 所以我想我应该逐行执行 100 000 行
  • 在“for (keys %hash) {}”循环中更改键

    我记得关于不更改密钥的事情 for my key keys hash 例如 for my key keys hash key key x 但是删除键并更改值就可以了 我的记忆还好吗 我想你记住的是这样一个事实 如果你这样做 for my i
  • PERMISSION_DENIED Firestore CloudFunction TypeScript

    I have set my Firestore permission so that anyone with my database reference will be able to read or write to my databas
  • cx_freeze 之后的 subprocess.Popen 行为

    我有一些 python 代码使用subprocess Popen打开控制台应用程序并从中获取 stdout stderr 从解释器启动工作正常且符合预期 使用 cx freeze 后 base name Win32GUI选项 Popen 现
  • 游标中的动态表名

    我正在尝试插入架构是动态的数据 就像用户输入架构名称一样 由于某种原因我得到ORA 000942 table doesn t exist即使表存在于正确的架构中 这是代码 declare l ext files names varchar2
  • Oracle SQL Developer 导出源以进行版本控制

    我们有包含很多内容的大型数据库 我想使用版本控制 Git 来管理更改 有很多文章如何一步一步地做到这一点 但我缺少一篇 整个数据库 不包括数据 的文件结构是否有标准或推荐的方法以及如何从现有数据库中获取它 它有很多源 程序 函数 包等 版本
  • MATLAB 使用 IF 语句返回向量函数

    我将一个自写函数称为向量的 函数 如下所示 x values 0 1 2 result func x values 问题是在这个函数中我有一个if语句来确定输出 如果我将此函数应用于标量 则没有问题 但如果我将其应用于数字向量 则if声明没
  • 在android中的listview中加载本地xml数据

    您能建议一个在列表视图中加载本地 XML 数据的简单示例吗 首先将您的 XML 文件放入 raw 文件夹中 然后使用下面的代码使用 Dom Parser 解析此 XML 文件 public class XMLParsingDOMExampl
  • R 函数不返回值

    我正在编写我的第一个 R 函数 IMDBmovierating lt function movie link lt paste http www omdbapi com t movie y plot short r json sep jso
  • ViewPager 内的 ScrollView:滑动不起作用

    我有包含三个片段的 ViewPager 其中之一是内部带有 ScrollView 的 FrameLayout
  • .git 文件夹是什么?

    文件夹叫什么 git 它是在存储库中创建的 其中包含什么以及为何创建 git 初始化为git init git 包含版本控制所需的所有信息 如果您想克隆您的存储库 复制 git 就足够了 4个子目录 hooks 示例脚本 info excl
  • 如何使用 R 从 CrossRef 中提取 xml 数据?

    如果您输入 CrossRef 电子邮件 以下 URL 会生成一个 XML 文件 http www crossref org openurl title Science aulast Fern ndez date 2009 multihit
  • 1054, 字段列表中未知列“索引”

    df row head identifier link likes count company 0 2292512316069378197 https www instagram com p B Qo84ihfiV 9608 Ralph L
  • 在 Hibernate 标准结果中排除 bean 的字段

    以下是我如何从数据库获取用户 bean session createCriteria User class list 这将返回数据库中的所有用户记录 有趣的是 我不想从数据库获取密码字段 只是想在检索时排除该字段 我有的选择 1 使用其他领
  • 到底什么是类工厂?

    我经常看到这个词被抛出 随着时间的推移 我自己可能在代码和库中使用过它 但我从未真正理解它 在我遇到的大多数文章中 他们只是继续期待你能弄清楚 什么是类工厂 有人可以解释这个概念吗 以下是一些补充信息 可能有助于更好地理解其他几个较短但技术