我解析/处理来自许多不同流(具有不同格式)的数据,并且不同数据源的数量在我的系统中不断增长。我有一个基于配置文件的工厂类,指定源将为我提供适当的解析器/处理器对(遵循一个小的通用接口)请求如下:
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
选项......它以某种方式告诉我即插即用的概念,但我不确定是什么解决这个问题的方法很好。
答案 0 :(得分:1)
好吧,您只需创建一个工厂界面,并在该工厂的子类型之间划分逻辑。因此,libFooA可能有一个子工厂(类型/实例),而libFooB可能有另一个子工厂(类型/实例)。然后,您可以根据要在特定方案/程序中支持的子工件/库来创建复合工厂。然后你甚至可以进一步细分工厂。您还可以为复合类型创建工厂枚举器,并取消所有切换逻辑。然后,您可以对您的libFooA工厂实例说,以在更高级别启用仔细模式或简单模式。因此,FooFactory实例和子类型的图形可以很容易地变化,类结构可以像树一样。库是实现最小化依赖关系的一种方法,但可能有更合理的方法来划分专门的子工厂。
答案 1 :(得分:0)
我不确定你是否可以绕过导入FooA,FooB ......因为在任何特定时刻,任何一个都可能被实例化。至于模块化,我建议创建在switch语句中调用的辅助函数。