2012-01-17 65 views
1

我正在开发一个分区工具,我在设计中遇到问题。我有一个类(称为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;  

    ... 
    } 

}

这很长的开关/箱会增加太多ciclomatic复杂的代码(即使代码很容易理解)。

那么,有没有更好的解决方案,可以避免很长的“开关/情况”,不浪费资源?

回答

1

一种方法是使用Singleton模式实现工厂。对每个管理其实例的工厂类使用静态Instance()方法。然后在你的映射中,你可以存储一个指向该方法的函数指针。

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

+0

谢谢!对于这个问题,这是一个有趣的方法。 – 2012-01-18 19:41:51