2010-03-26 48 views
30

我看到经常出现的单词,而且随着时间的推移,我可能自己在代码和库中使用它,但我从来没有真正懂过。在我遇到的大多数写作中,他们只是继续期待你找出答案。班级工厂究竟是什么?

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

回答

12

类工厂构造其他类的实例。通常,它们创建的类共享一个公共基类或接口,但返回派生类。

例如,你可以有一个类工厂,把数据库连接字符串,返回执行IDbConnection这样SqlConnection(类和接口的.NET)

5

类工厂是一种方法,根据一些参数(例如)返回给您一个自定义的类(未实例化!)。

1

我觉得这解释得很好(对我来说,无论如何)。我认为,工厂设计模式中使用了类工厂。

像其他创建模式,它[工厂设计模式] 涉及没有指定 确切类对象,这将是 创建的创建 对象(产品)的问题。工厂方法设计 图案由 限定用于 一个单独的方法创建的对象,子类则 可以覆盖到指定将 创建产品的 派生类型处理这个问题。更一般地说,术语 工厂方法通常用于将 引用到其主要目的是创建对象的任何方法。

http://en.wikipedia.org/wiki/Factory_method_pattern

道歉,如果您已经阅读了这一点,并发现它是不够的。

25

这里有一些额外的信息,可以帮助我们更好地理解其他技术上正确但短的答案。

从最严格的意义上讲,类工厂是一种函数或方法,它根据从输入参数或全局上下文中确定的某些条件创建或选择一个类并将其返回并返回。当需要对象的类型直到运行时才能确定时,这是必需的。当类本身就是所用语言的对象时,可以直接完成实现,比如Python。由于任何类的主要用途都是用类似C++的语言来创建它自己的实例,其中类不是可以传递和操作的对象,所以类似的结果通常可以通过模拟“虚拟构造函数”来实现,你调用一个基类构造函数,但返回一个派生类的实例。这必须被模拟出来,因为构造函数不能真正在C++中使用,这就是为什么这样的对象而不是类工厂通常被实现为独立函数或静态方法的原因。

虚拟函数通常解决“late”通过引用的实际类型的对象,但在构造的情况下,该对象不存在,所以类型必须通过一些其它手段来确定。

最好的实现方式是那些在添加新候选类时自动处理新候选类的方法,而不是仅将当前硬编码到工厂中的某个有限集合(尽管如果工厂是唯一需要的工厂修改)。

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书中的设计模式。特别注意Virtual Constructor部分(使用他的Envelope/Letter模式结构)。

另请参阅相关答案Class factory in Python。另请参阅Abstract Factory, Template Style这是2001年Dobb博士的文章,也是关于使用C++模板实现它们的文章。