返回首页

介绍
工厂已经完成死亡对象实现的,你可能想知道地球上的quot;超级Factoryquot;是。简而言之,它是一个对象工厂它可以创建任何类型的对象,并返回他们各自的基类接口。
这确实是一个非常有用的功能(尤其是持久性框架)。传统的对象工厂实现需要用户可以选择:获得从一个公共基类在运行时创建的对象,或使用多个工厂创建异构对象。
超级工厂暴露一个统一的界面,在运行时创建的异构对象。
(请注意,长期quot; Superquot;在这里被用来指quot;非常genericquot,或quot;范围或contentquot的广泛;不是一个卓越的方法/执行)如何使用代码
使用的代码是很容易的。我们需要做的是一个的文件SuperFactory.h(见本文附带的源代码)添加到我们的项目。
若要添加类厂支持,我们需要quot; registerquot;它在执行文件(CPP)。这个类。宏已被列入最常见的用例。
宏的语法:

SF_Register_Type[_Base(n)]( <SF_Concrete/SF_Abstract>, <class name>, 

                 <base1>, <base2>, ... <base(n)> );

因此,例如,注册一个抽象类,它不具有任何的基类的一个,我们将使用:{C}
注册一个具体的C类,其中有两个基类A和B,我们将使用:
SF_Register_Type_Base2( SF_Concrete, C, A, B );

一旦类被注册,工厂的create方法可以被用来创建所需的对象。一个简单的例子
考虑在其各自的头文件中定义下面的类:在阿

回答

评论会员:Stefan_Lang 时间:2012/02/06
这是一个有趣的概念,但我不知道,当你想使用它

我使用的情况下,我不知道哪种类型在编译时创建的工厂。我想通常的类型取决于一些变量或一组变量的值。该工厂的任务是分析的变量(SE)(S),并创建相应的对象,可能使用一些初始化通过它得到信息。该工厂的主要目的是使应用程序的部分,不需要了解它的类层次结构不透明。

OTOH,如果我不知道我想在编译时类型,然后我只是调用新的

什么SuperFactory提供新的不能?要创建一个X型,代码单元,调用上SuperFactory仍然需要知道类X的对象​​,如果该代码希望通过基类指针,使用对象,还需要了解的层次。有什么用Superfactory然后
评论会员:?FrancisXavier 时间:2012/02/06
喜斯特凡,
Stefan_Lang写道:这是一个有趣的概念,但我不知道,当你想使用它,将是一个可能使用的SuperFactory反序列化?请看到这个项目,为使用它的例子:{A}

Stefan_Lang写道:我使用的情况下,我不知道哪种类型在编译时创建的工厂。我想通常的类型取决于一些变量或一组变量的值。该工厂的任务是分析的变量(SE)(S),并创建相应的对象,可能使用一些初始化通过它得到信息。工厂的主要目的是使那些部分的应用程序不需要知道在文章中提出的后援代码的类层次结构不透明,创建一个对象,给出一个标识符(在这种情况下,一个字符串) 。以同样的方式,一个正常的工厂工作。然而,如果你想创建不同类型的对象(即,通过继承彼此不相关的对象),通常你需要创建和管理许多不同的工厂。创建对象时,你需要知道关于"使用它来创建这些对象工厂"。 SuperFactory尝试减少这样的要求 - 一个单一的SuperFactory是不足以创造许多不同类型的对象

如果你在代码中,你会发现,SuperFactory使用一个函数来创建的每个对象。此功能可以由用户指定时登记的SuperFactory的类型。如果没有指定,默认的功能是用来简单地创建所需的对象,使用新的。然而,你可以提供自己的功能,如果您需要自定义创建的逻辑。

Stefan_Lang写道:OTOH,如果我不知道我想在编译时类型,那么我只需要调用new.Yes,如果你知道在编译时的类型,然后SuperFactory提供了手动创建的对象没有任何优势

Stefan_Lang写道:什么SuperFactory提供新的不能?要创建一个X型,代码单元,调用上SuperFactory仍然需要知道类X的对象​​,如果该代码希望通过基类指针,使用对象,还需要了解的层次。有什么用,是Superfactory SuperFactory只是另一个工厂 - 它从一些信息(在这种情况下,标识符字符串)创建的对象。除,而不是几个工厂(每种类型的对象之一)正常使用,你可以选择,而不是使用一个单一的SuperFactory。

最好的问候,
弗朗西斯泽维尔
"空你的杯子,以便它可以填补;成为没有获得整体" - 1975年,李小龙,截拳道
评论会员:游客 时间:2012/02/06
Stefan_Lang:啊,好像我是混合与instantiatian(​​需要在变量可能只包含字符串)部分注册(需要实际类型)。这使得很多更有意义呢!感谢您的响应,并再次感谢您的优秀文章。(5{S0})
FrancisXavier
评论会员:游客 时间:2012/02/06
谢谢你的赞赏!{S0的}"空你的杯子,以便它可以填补;成为没有获得整体"-1975年,李小龙,截拳道道:阿布舍克塔拉
尼斯的努力,为了健康讨论。我觉得这是一个反模式。 。NET中是如何不同的签名

创建对象(参数)
评论会员:FrancisXavier 时间:2012/02/06
喜阿布舍克,

我不太清楚,我跟着你。你指的是Activator.CreateInstance方法

最好的问候,
弗朗西斯泽维尔
"空你的杯子,以便它可以填补;成为没有获得整体" - 1975年,李小龙,截拳道
评论会员:游客 时间:2012/02/06
supergoofy:你如何处理从一个lib内注册类?将它的工作原理?感谢
FrancisXavier:本文提供的代码和宏的用意是要在一个单一的编译单元使用。如果您使用此代码库,该库将有自己的工厂的"实例"。

如果你需要单独的工厂,以减少混乱和逻辑上独立的工厂正在使用的,我会建议命名空间SuperFactory类。这是因此,它是明确到每个人阅读的工厂正在使用的代码。例如,如果我们有一个图书馆,评估一些表达式,然后使用SuperFactory内的库代码看起来像这样:
ExpressionEvaluator :: SuperFactory ::创建("诠释",_pValue);

然而,它也有可能(虽然它不会像漂亮的),使用在不同的编译单元中的一个(真正的超级{S0的})工厂。在这种情况下,你将有揭露任何一个编译单元到SuperFactory对象的引用。然后在其他编译单元使用手动注册所需的类型。一旦做到这一点,你可以使用该SuperFactory实例创建的类型。
"空你的杯子,以便它可以填补;成为没有获得整体" - 1975年,李小龙,截拳道
涛上周四,2011年9月15日,3:21 AM
修改
评论会员:FrancisXavier 时间:2012/02/06
我发现优秀的文章,一些好的想法(我),
但我不同意的方式列举优点缺点ERE。

非常容易使用和维护:Cetainly容易使用,我可以不同意"保持":
保持意味着"低概率引入的错误,当别人把手中的代码,使其做其他事情。"
有一个"注册"源文件可以是一个问题,如果其中一人(或错误配置)失踪不能解决成一个编译错误。
的东西,如SF_Register_Type_Base2(SF_Concrete,A,B,C);不是"易于维护",因为未来的开发人员可以改变
C类:公众,公共b转化C类:公共甲,乙公众,公共电子,有没有发生,使得它也想知道登记声明中添加了",电子"
这就是说,它是一个事实上,这些问题是不是这里的代码,类似图书馆管理"工厂"有同样的问题(即从C语言的语义起源)
。笔者自己宣称"如果层次结构的改变,一些需要维护"。但问题是,在这里,有没有"执法"的。如果你不这样做,你获得的东西,编译,是"马车"没有你有任何线索。

不需要RTTI的没错,但...它既不是赞成或反对。 ÇRTTI的是动态转换。有没有"动态类型的创作"和"反射型"在C。简单的RTTI是另一回事,不涉及到这一进程。
其实所有的"注册机制"是创建一个数据结构,代表类型的继承图。在数据结构的RTTI也仿照这种图使用内部管理类型识别和动态转换。
,而不是"避​​免RTTI的"世界有更好的扩展功能支持动态创建。不幸的是,这是没有可能是RTTI的基础设施完全不透明(因此需要建立一个平行的基础设施)
道德:我不知道什么原因多次bash中的RTTI,虚函数和dynamic_cast,并开始创建,以取代他们的代码或数据结构的程序员...事实上,复制他们。
这不是这里的情况,但某些"利弊通常总是宣称"我的感觉,他们更时尚的事,比真正的性能增益。
想:"我说'不需要RTTI的",因为这使我的文字更冷静",而不是因为RTTI,在我的范围内有任何作用
有效,但不老实。
2错误。GT;重新编译... 发现65534错误。{中三}