2

我解析/处理来自许多不同流(具有不同格式)的数据,并且不同数据源的数量在我的系统中不断增长。我有一个工厂类,它基于指定源的配置文件将为我提供适当的解析器/处理器对(遵守小型通用接口),如下所示:

static Foo* FooFactory::createFoo(source c, /*couple flags*/)
{
    switch (c)
    {
        case SOURCE_A:
        {
         //3 or 4 lines to put together a parser for A, and something to process stuff    from the parser
             return new FooA(/*args*/);
        }
        break;
        //too many more cases which has started to worry me
        default:
            return NULL;
    };
}

问题是随着来源数量的增加,我面临两个问题。首先,当我构建时,我发现自己在提取所有FooA, FooB, FooC, FooD, FooE...相关代码——即使我可能只对构建一个我只会请求的二进制文件感兴趣FooA。那么如何进行模块化。第二个问题是,现在,在 的情况下SOURCE_A,我正在返回FooA,但是如果我对它感兴趣,SOURCE_A但我有不同的解析方式,也许我想要FooA_simple并且FooA_careful还具有即插即用的能力,该怎么办?

出于某种原因,我想到的一件事是-u在构建二进制文件时链接器的选项......它以某种方式向我暗示了即插即用的概念,但我不确定解决这个问题的好方法是什么。

4

2 回答 2

1

好吧,您只需创建一个工厂接口并在该工厂的子类型之间划分逻辑。所以可能有一个用于 libFooA 的子工厂(类型/实例),而另一个用于 libFooB。然后,您可以根据要在特定场景/程序中支持的子工厂/库来简单地创建一个复合工厂。然后你甚至可以进一步细分工厂。您还可以为复合类型创建工厂枚举器并取消所有切换逻辑。然后你可能会对你的 libFooA 工厂实例说在更高级别启用谨慎模式或简单模式。因此,您的 FooFactory 实例和子类型图可能很容易发生变化,并且类结构可能像一棵树。库是一种接近它以最小化依赖关系的方法,但可能有更合乎逻辑的方法来划分专门的子工厂。

于 2012-11-07T05:31:19.693 回答
0

我不确定您是否可以绕过导入 FooA,FooB... 因为在任何给定时刻,它们中的任何一个都可能被实例化。至于模块化,我建议创建在 switch 语句中调用的辅助函数。

于 2012-11-07T04:53:30.647 回答