我经常看到这个词,我可能已经在代码和库中使用了它,但我从来没有真正得到它。在我看到的大多数写作中,他们只是希望你能够弄明白。
什么是班级工厂?有人可以解释这个概念吗?
答案 0 :(得分:28)
这里有一些额外的信息可能有助于更好地理解其他一些技术上正确但更短的答案。
在最严格的意义上,类工厂是一个函数或方法,它根据输入参数或全局上下文确定的某些条件创建或选择一个类并返回它。当在运行时之前无法确定所需对象的类型时,这是必需的。当类本身就是所使用语言的对象时,可以直接实现,例如Python。
由于任何类的主要用途是创建自身的实例,在C ++等语言中,类不是可以传递和操作的对象,通常可以通过模拟“虚拟构造函数”来实现类似的结果,其中你调用基类构造函数,但得到一些派生类的实例。这必须被模拟,因为构造函数在C ++中实际上不能是virtual ✶ ,这就是为什么这样的对象 - 不是类 - 工厂通常作为独立功能或静态方法实现。
尽管使用对象工厂是一个简单而直接的方案,但它们需要手动维护基类“make_object()
函数中所有受支持类型的列表,这可能容易出错且劳动 - 密集(如果不是过度看)。它还违反了封装 ✶✶ ,因为基类的成员必须知道所有基本的具体后代类(现在和将来)。
✶虚拟函数通常由引用的实际对象类型解析为“late”,但在构造函数的情况下,该对象尚不存在,因此类型必须通过其他方式确定。
✶✶ Encapsulation是一组类和函数设计的属性,其中特定类或函数的实现细节的知识隐藏在其中 - 并且面向对象编程的标志之一。
因此,最佳/理想的实现是那些可以在添加新候选类时自动处理它们而不是只有当前硬编码到工厂中的某个有限集的那些(尽管由于工厂是唯一的,因此通常认为是可接受的权衡需要修改的地方)。
James Coplien 1991年出版的书Advanced C++: Programming Styles and Idioms详细介绍了在C ++中实现这种虚拟通用构造函数的一种方法。有更好的方法可以使用C++ templates来实现这一点,但是在本书中没有涉及到将它们添加到标准语言定义之前的内容。实际上,C ++模板本身就是类工厂,因为它们只要与不同的实际类型参数一起使用就会实例化一个新类。 更新:我找到了他为EuroPLoP撰写的一篇1998年论文,题为C++ Idioms,除此之外,他还修改了他的书中的成语并将其重新组合成了1994年的设计模式形式Design Patterns: Elements of Re-Usable Object-Oriented Software 3}}书。请特别注意Virtual Constructor部分(使用他的Envelope/Letter模式结构)。
有关问题Class factory in Python,请参阅此处的相关答案。另请参阅Abstract Factory, Template Style,这是2001年Dobb博士的文章,也是关于使用C ++模板实现它们的。
答案 1 :(得分:14)
类工厂构造其他类的实例。通常,它们创建的类共享一个公共基类或接口,但返回派生类。
例如,您可以拥有一个带有数据库连接字符串的类工厂,并返回一个实现IDbConnection
的类,例如SqlConnection
(来自.Net的类和接口)
答案 2 :(得分:5)
类工厂是一种方法(根据一些参数,例如)返回一个自定义类(未实例化!)。
答案 3 :(得分:2)
我觉得这很好地解释了(无论如何)。我认为工厂设计模式中使用的是类工厂。
与其他创作图案一样,它[工厂设计模式] 处理创造的问题 没有指定的对象(产品) 将要确切的对象类 创建。工厂方法设计 模式处理这个问题 定义一个单独的方法 创建对象,哪个子类 然后可以覆盖以指定 衍生出来的产品类型 创建。更一般地说,这个词 工厂方法经常用来指代 任何主要目的的方法 创造对象。
http://en.wikipedia.org/wiki/Factory_method_pattern
如果你已经读过这篇文章并发现它不够,请道歉。
答案 4 :(得分:2)
维基百科文章提供了一个非常好的定义:http://en.wikipedia.org/wiki/Factory_pattern
但可能最权威的定义可以在Gamma等人的 Design Patterns 一书中找到。 (通常称为四人帮)。