mar*_*eau 30
Heres的一些附加信息可能有助于更好地理解其他一些技术上正确但更短的答案.
在最严格的意义上,类工厂是一个函数或方法,它根据输入参数或全局上下文确定的某些条件创建或选择一个类并返回它.当在运行时之前无法确定所需对象的类型时,这是必需的.当类本身就是所使用语言的对象时,可以直接实现,例如Python.
由于任何类的主要用途是创建自身的实例,在C++等语言中,类不是可以传递和操作的对象,通常可以通过模拟"虚拟构造函数"来实现类似的结果,您可以在其中调用基类构造函数,但返回一些派生类的实例.这必须进行模拟,因为构造函数不能真的成为虚拟✶在C++中,这就是为什么这样的对象不是类工厂通常作为独立的函数或静态方法来实现.
✶虚函数通常由引用的实际对象类型" 迟 " 解析,但在构造函数的情况下,对象尚不存在,因此类型必须通过其他方式确定.
最好的实现是那些在添加它们时自动处理新候选类的实现,而不是只有当前硬编码到工厂的某个有限集(尽管如果工厂是唯一需要修改的地方,通常可以接受权衡).
James Coplien 1991年出版的" 高级C++:编程风格和成语 "一书详细介绍了在C++中实现这种虚拟通用构造函数的一种方法.有更好的方法可以使用C++模板来实现这一点,但是在本书中没有涉及到将它们添加到标准语言定义之前的内容.实际上,C++模板本身就是类工厂,因为它们只要与不同的实际类型参数一起使用就会实例化一个新类. 更新:我找到了他为EuroPLoP撰写的一篇1998年论文,名为C++ Idioms,其中,他将书中的成语修改并重新组合成1994年设计模式:可重用的面向对象软件的元素的设计模式形式书.请特别注意Virtual Constructor部分(使用他的Envelope/Letter模式结构).
有关Python中的Class factory问题,请参阅此处的相关答案.另请参阅Abstract Factory,Template Style,这是2001年Dobb博士的文章,也是关于使用C++模板实现它们的文章.
Row*_*haw 15
类工厂构造其他类的实例.通常,它们创建的类共享一个公共基类或接口,但返回派生类.
例如,你可以有一个类工厂,它接受一个数据库连接字符串,并返回一个实现IDbConnection
如SqlConnection
(来自.Net的类和接口)的类.
归档时间: |
|
查看次数: |
25310 次 |
最近记录: |