我正在开发一个分区工具,我在设计中遇到问题。我有一个类(称为CtrlFactories),它将读取MBR并为MBR中找到的每个分区构建一个对象。我为每种类型的分区都有一个类,每个类都有一个工厂。这种情况下的良好构建模式是什么? (分区工具)
这里是如何看起来像:
(我只放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复杂的代码(即使代码很容易理解)。
那么,有没有更好的解决方案,可以避免很长的“开关/情况”,不浪费资源?
谢谢!对于这个问题,这是一个有趣的方法。 – 2012-01-18 19:41:51