C++,具有各种论点的工厂登记处

Registry of factories with varied arguments C++

本文关键字:工厂 登记处 C++      更新时间:2023-10-16

我需要构造两个对象,AB 。这些AB对象可以通过不同的方式初始化。

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

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

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

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

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

我真的很喜欢这种组合注册表和工厂设计模式;其他人可以轻松地制作自己的文件类型和用于加载它的工厂,将其签入注册表,并在不查看其他代码的情况下使用它。

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

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

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

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

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

你会如何处理这个问题?

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

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

否则,如果在点T 1 处不知道参数值,则必须具有 T 2> T1,并且参数值(无论 B 的类型如何)必须在 T2 处已知。在这种情况下,将 B 类 id 转发到 T2。然后在 T2 点从 id 中查找参数和创建函数,例如在 switch 中。

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

有什么联系?