2011-08-21 73 views
5

我对C++的开发和设计颇为陌生,所以我提前在我的问题中道歉很模糊或结构不好。我在我的代码中有几个不同和不相关的层次结构,我想使用Alexandrescu描述和实现的通用工厂来实例化来自这些层次结构的对象。
我有困难的部分是初始化阶段。这些类具有非常不同的初始化需求。有时初始化所需的数据可以从存储(DB)中查找,在这种情况下,我可以将初始化过程封装在特定类的某个Init()方法中。但是其他时候,只有在实例化的时刻才能知道数据,并且需要手动传递给对象。我正在努力想出一个统一的方式来做到这一点。有没有人有任何关于解决这类问题的建议? 谢谢C++中的对象初始化和对象工厂

+0

Alexandrescu也是政策的粉丝,因此您可以为您的工厂制定分配政策。但是,如果具体分配需求取决于运行时数据,那么我想你无法绕过运行时切换分配器。也许注册一个分配器回调的集合... –

+0

根本不使用工厂(以避免这些问题)。工厂可以解决一些问题,但他们很少需要 –

+0

感谢您的回复。你能解释一下“运行时切换分配器”的含义吗? – stas

回答

4

你正在飞驰着Over-Engineering高速公路......头先。

工厂很少需要,没有两个工厂是相似的(正如你注意到的)。

尝试为所有工厂提供基类是没用的,因为这个基类没有明确的语义。它构建了什么? Bird s? Car s?他们是无关的... Object s?这不是Java!

如果您希望使用工厂(出于某种原因),那么Factory应产生一种类型的对象,所有对象都来源于一个公共基类。如果你有几种物体,那么你需要几种工厂。

如果您发现工厂代码重复,请使用模板提升公用代码。

0

如果我猜对了,你的问题是,你不知道如何将不同的参数集传递给你的工厂方法。如果是这样,我可以建议你再创建一个层次结构/让我们称之为FactoryHelper。该层次结构的具体类将包含用于实例化具体类的特定数据,例如FactoryPerfectA的FactoryHelperA将包含一个字符串,ProductB的FactoryHelperB将包含int。工厂的抽象方法必须接受抽象基类 - FactoryHelper作为参数。您的工厂的具体方法会将此参数投射到具体的FactoryHelperA或FactoryHelperB,并获得特殊实例的specefic数据。产品

但这不是很好的设计。我想你试图错误地使用工厂方法。