2012-01-17 51 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

相關問題