c++ - 对于这种情况,什么是好的构建模式? (分区工具)

标签 c++ oop design-patterns

我正在开发一个分区工具,我在设计中遇到了一个问题。我有一个类(称为 CtrlFactories),它将读取 MBR 并为在 MBR 中找到的每个分区构建一个对象。每种类型的分区都有一个类,每个分区都有一个工厂。

这是它的样子:

UML

(我在示例中只放了 NTFS 和 FAT32,但每种类型的分区都有一个)。

我的想法是在 IFactory 中放入如下内容:

std::map< EPartType, IFactory* > mpFactories;

然后在构造函数或一些初始化函数中构建它:

IFactory::IFactory()
{
    mpFactories[PART_NTFS] = new FactoryNTFS();
    mpFactories[PART_FAT32] = new FactoryFAT32();
    mpFactories[PART_EXT2] = new FactoryEXT2();
    ...
}

在“构建”函数中,执行:

int CtrlFactories::Build()
{
    ...
    MBR mbr;
    BuildMBR( mbr );

    //... here I loop all the partitions found...
    for( /*each partition*/ )
    {
        IPartition* part = mpFactories[ mbr.GetPartType() ]->Build( mbr.PartPosition() );
        //..and store each partition somewhere
    }
}

关键是:我有很多分区类型(> 100),在大多数情况下,用户在 HD 中只会有两三个不同类型的分区。因此,分配所有工厂而不使用其中的大部分工厂似乎是在浪费时间和内存。我认为惰性初始化在这里会好得多,但我需要在某个地方使用如下代码:

    switch( mbr.GetPartType() )
    {
    case PART_NTFS:
        if ( mpFactories[ PART_NTFS ] == NULL )
            mpFactories[PART_NTFS] = new FactoryNTFS();
        break;       

    case PART_FAT32:
        if ( mpFactories[ PART_32 ] == NULL )
            mpFactories[PART_32] = new Factory32();
        break;       

    ...
    }

而且非常长的 switch/case 会给代码增加太多的复杂性(即使代码很容易理解)。

那么,有没有更好的解决方案,可以避免很长的“switch/case”,又不浪费资源?

最佳答案

一种方法是使用单例模式来实现工厂。在管理其实例化的每个工厂类上都有一个静态 Instance() 方法。然后在您的 map 中,您可以存储指向该方法的函数指针。

然后,在您的 Build() 代码中,您会为遇到的每个分区查找指向工厂的 Instance() 方法的指针。使用该指针获取您需要的实际工厂,然后从那里继续。

关于c++ - 对于这种情况,什么是好的构建模式? (分区工具),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8903326/

相关文章:

php - MVC 中的服务去哪里了?

language-agnostic - 抽象基类何时可以拥有(非静态)数据成员?

html - 滑动 View 中幻灯片的 CSS

c# - C#上使用工厂模式访问问题

c++ - 在 C++ 中将结构保存到剪贴板

C++元编程递归步数限制

c++ - 指针地址

c# - 一种非常常见的 C# 模式,它打破了非常基本的 OOP 原则

python - 如何避免设计成员函数相互依赖的类?

c++ - QtConcurrent::map 不接受参数