2012-01-17 9 views
1

私はパーティションツールを開発しており、設計上の問題に直面しています。 MBRを読み込み、MBRにある各パーティションのオブジェクトを構築するクラス(CtrlFactories)があります。私はパーティションの種類ごとにクラスを持ち、それぞれにはファクトリを持っています。この状況に適したビルドパターンは何でしょうか? (パーティションツール)

UML

(私は例にのみNTFSとFAT32を入れてきましたが、私は、パーティションの種類ごとに1を持っている):ここでは

は、それがどのように見えるかです。

私の考えは次のようIFactoryです何かに入れていた:コンストラクタで

std::map< EPartType, IFactory* > mpFactories; 

そして、それを構築し、またはいくつかのinit関数で:

IFactory::IFactory() 
{ 
    mpFactories[PART_NTFS] = new FactoryNTFS(); 
    mpFactories[PART_FAT32] = new FactoryFAT32(); 
    mpFactories[PART_EXT2] = new FactoryEXT2(); 
    ... 
} 

そして、「構築」機能では、 do:

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には2つまたは3つの異なるタイプのパーティションしかありません。だから、すべての工場を割り当て、それらのほとんどを使わないということは、時間と記憶の無駄のようだ。私はここで遅延初期化が可能だろうとずっと良いと思うが、私はどこかで必要となるコードのように:コードにすぎciclomatic複雑さを追加します

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;  

    ... 
    } 

}

そして、それは非常に長いスイッチ/ケース(コードも分かりやすい)。

だから、非常に長い「スイッチ/ケース」を避けることができ、リソースを無駄にしない、より良い解決策がありますか?

答えて

1

1つの方法は、シングルトンパターンでファクトリを実装することです。インスタンス化を管理する各ファクトリクラスにstatic Instance()メソッドを持たせてください。次に、マップ内にそのメソッドへの関数ポインタを格納することができます。

Build()コードでは、あなたが遭遇する各パーティションの工場のInstance()メソッドへのポインタを探しています。そのポインタを使用して必要な実際の工場を取得し、そこでそこから進んでください。

+0

ありがとうございました!それは問題の面白いアプローチです。 –

関連する問題