首页 > 解决方案 > 为 STL 随机数生成器编写工厂方法

问题描述

我试图通过一个配置文件提供一个界面,让我的用户为他们正在使用的一些参数选择一个分布。为此,我想使用 STL 随机数生成器算法。

假设我的程序从命令行读取 JSON。对于下面提供的 JSON,程序需要意识到它应该从具有给定均值和标准变化的正态分布中生成一个随机数。(我使用与 STL 库相同的参数名称进行清除。)

{
    "dist": "normal_distribution",
    "mean": 0.1,
    "stddev": 0.5
}

到目前为止,我可以轻松解析 JSON,并使用每个分布param_type来初始化分布。我使用名称来决定哪个分布来决定param_type和分布。

我不知道如何很好地实现这一点。我知道我应该为此提供某种工厂方法,传递 JSON,然后输出一个函数或一个类。如果我想返回一个类的实例,比如说unique_ptr生成器的一个,我需要定义一个抽象类,例如,RandDist并编写某种适配器来合并我的输入,...。我通常不需要一个课堂上的很多,一个gen()方法就足够了。

我想知道是否有人对此有想法。或者,如果有人知道可以做到这一点的图书馆。

PS 输入不必是 JSON 对象,任何哈希表本身都可以工作。

标签: c++design-patternsrandomc++17

解决方案


您描述了一种处理这种情况的非常标准的方法——RandomGenerator只有一个虚拟方法的抽象类gen()

然后,它将具有诸如等的实现NormalDistributionGeneratorUniformDistributionGenerator其中构造函数接受适当的分布参数集并将 STL 内容初始化为成员。这些具体类将仅在生成器创建例程中直接使用,并在其他地方用作抽象类RandomGenerator

所以创建例程看起来像这样

std::unique_ptr<RandomGenerator> CreateRandomGenerator(const Info& info) {
    switch (info.type) {
    case Type::Normal:
        return std::make_unique<NormalDistributionGenerator>(info.mean(), info.stddev());
    case Type::Uniform:
        return std::make_unique<UniformDistributionGenerator>(info.a(), info.b());
    // ...
    }
}

Info- 是一个包含分发信息的类(一些 JSON 包装器,map/hash_table - 任何最适合您的情况)。

因此,您肯定需要编写一些样板代码来使其工作,但它会使您的使用RandomGenerator简单明了,并且添加新类型的发行版将很容易,并且只需要在一个地方修改代码 - 工厂方法。


推荐阅读