到底什么是类工厂?

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(使用前将#替换为@)

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

随机推荐

  • 如何使 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 使用其他领
  • 到底什么是类工厂?

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