jal*_*one 5 c++ constructor design-patterns
我有一个设计问题,实际上并不复杂,但我想找到一种优雅的方法来解决它。我想到了这一点:
问题:我有一个 A 类,它初始化并保留 B 的集合
B 只是一个接口,必须实现(所以我们有类 C、D、E、..)。
在构造函数 A 中接收一堆数据集,并且必须在给定每个数据集的情况下初始化 B 的一些(还有相同或不同类的许多不同实例)。我希望 A 不知道 B 的任何实现。
我有几个可行的解决方案,但我正在考虑一种“构造函数中的委托”。例如:
1. for each dataset, ds
2. for each implementation of B, bi
3. try to instantiate bi(ds)
4. if success (means no exception)
5. keep reference
Run Code Online (Sandbox Code Playgroud)
这是因为我用来检查 bi 是否与初始化完全相同的数据和微积分,并且在性能关键的应用程序中,我希望避免这样做两次或在集合类中这样做。
这真的很好,但显然问题是第 2 行...
...以及对使用异常来处理实际上不是异常的事情的疑问。(第 4 行)
那么应该是一种模式
- 让我评估数据并构建所有内容。
- 避免创建多个“架构类” 对于这样一个简单的任务,我想避免类的爆炸(恕我直言,当夸大以下设计模式java风格原则时,这是典型的)。- 尽可能快。
- ...很优雅:)
小智 1
您的伪代码提出了一个解决方案:您使用的bi只不过是一个工厂函数,它接受 adataset作为输入并返回 aB*作为输出。因此,您实际上只需要从对象bi集合中获取即可std::function<B* (dataset)>。
要求这些工厂只是“条件”工厂是很容易的:有时它们返回有效对象,有时不返回,nullptr而是返回。这可以让您避免异常,并且更忠实于您的使用意图。