C++,具有各种论点的工厂登记处
Registry of factories with varied arguments C++
我需要构造两个对象,A
和 B
。这些A
和B
对象可以通过不同的方式初始化。
构造A
的设计模式(工作):
A
有子类A_txt
、A_tsv
、A_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++有什么关系。
有什么联系?
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用Unique_ptr确保工厂中的对象唯一
- 带有继承的C++工厂
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 工厂方法:分配和strcpy_s的差异
- C++库和自注册类:客户端应用程序中的工厂映射为空
- 这个工厂类在这个C++视频中的意义何在?
- 此工厂功能有什么问题?
- 注册对对象工厂的调用会导致段错误
- 工厂设计模式优化
- 在 C++ 中返回新的构造函数(*this)工厂
- 确保在编译期间仅同时使用来自同一工厂的对象
- 在工厂或C++类中包含数据库 .h 文件
- 在基类中编写工厂方法
- WIC 工厂将始终在 Windows7 上为 nullptr("What's a Creel?"教程中使用)
- 抽象工厂结构的差异
- 编写可测试的代码 - lambda 函数和unique_ptr中的basic_istream工厂
- 下面抽象工厂设计模式的实现是正确的吗
- 没有用于初始化模拟工厂的匹配构造函数
- C++,具有各种论点的工厂登记处