如何模块化大型工厂类?

时间:2012-11-07 04:40:37

标签: c++

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

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_simpleFooA_careful,但也能够即插即用?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

相关问题