我正在开发一个分区工具,我在设计中遇到了一个问题。我有一个类(称为 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;
...
}
而且非常长的 switch/case 会给代码增加太多的复杂性(即使代码很容易理解)。
那么,有没有更好的解决方案,可以避免很长的“switch/case”,又不浪费资源?
最佳答案
一种方法是使用单例模式来实现工厂。在管理其实例化的每个工厂类上都有一个静态 Instance()
方法。然后在您的 map 中,您可以存储指向该方法的函数指针。
然后,在您的 Build()
代码中,您会为遇到的每个分区查找指向工厂的 Instance()
方法的指针。使用该指针获取您需要的实际工厂,然后从那里继续。
关于c++ - 对于这种情况,什么是好的构建模式? (分区工具),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8903326/