2

我需要构造两个对象,A并且B. 这些AB对象可以以不同的方式初始化。

构建A(工作)的设计模式:

A有子类A_txt, A_tsv,A_csv等。每个A子类型都是从一个string(文件路径)构造的,但每个子类型都以不同的方式加载文件。我已经建立了一个注册表,将文件类型(例如 txt)映射到适当的工厂以创建该对象:

txt--> A_txt_Factory
tsv--> A_tsv_Factory
...

whereA_txt_factory接收文件路径,将其作为文本文件加载,然后返回指向A_txt对象的指针。

一起,我将此注册表用作工厂:给定文件路径和文件类型,它会查找与该标记对应的工厂,并使用它来构造并返回指向A对象的指针。

我真的很喜欢这种组合注册表和工厂设计模式;其他人可以轻松地创建自己的文件类型和加载它的工厂,将其签入注册表并使用它而无需查看其他代码。

要构建的设计模式B(我需要帮助):

构造B对象更加困难,因为它们并非都从相同的类型加载(例如,所有A子类型都使用string指示文件路径的 a 构造)。B_text将从文本文件(从提供的string指示文件路径)加载,但与以前不同,B_intAndA可能会从 int 和A.

我可以使用什么设计模式来创建B?和以前一样,我将有一个string标签来指示将使用哪个工厂;然而,与以前不同的是,每个工厂将接受不同的参数(可能还有不同数量的参数)。我想这可以通过可变参数的可变模板函数以某种方式完成(我使用的是 C++11,所以这是一个选项)。

这种设计模式是否曾经出现在其他任何人身上(相同的基类,但构造了不同数量的不同类型的参数)?

制作构建不同子类型的单个工厂很容易B,但很难知道如何允许它们使用注册表进行索引,因为它们接受不同类型和数量的参数。

你会怎么处理这个?

4

1 回答 1

0

在某个时间点 T 1,要创建的 B 的种类是已知的。B 的种类意味着构造函数的签名。在某个时间点 T 2(可能相同或更晚),B 被创建。

如果参数值在点 T 1是已知的,那么如果 T 2 = T 1只需在此处创建 B 并解决问题。否则,如果 T 2 > T 1,将参数和创建调用存储在仿函数(例如)中,并将其传递给 T 2[=]() -> B* { return new B_int_and_A( 42, *anAPointer ); },例如作为 a 。std::function

否则,如果在点 T 1处不知道参数值,那么您必须有 T 2 > T 1,并且无论 B 的种类如何,都必须在 T 2处知道参数值。在这种情况下,将 B kind id 传递给 T 2。然后在点 T 2从 id 中查找参数和创建函数,例如在 a 中switch

不过,我不明白这与 C++ 有什么关系。

有什么联系?

于 2012-08-08T21:45:22.443 回答