我正在開發一個分區工具,我在設計中遇到問題。我有一個類(稱爲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