私はパーティションツールを開発しており、設計上の問題に直面しています。 MBRを読み込み、MBRにある各パーティションのオブジェクトを構築するクラス(CtrlFactories)があります。私はパーティションの種類ごとにクラスを持ち、それぞれにはファクトリを持っています。この状況に適したビルドパターンは何でしょうか? (パーティションツール)
(私は例にのみ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;
...
}
}
そして、それは非常に長いスイッチ/ケース(コードも分かりやすい)。
だから、非常に長い「スイッチ/ケース」を避けることができ、リソースを無駄にしない、より良い解決策がありますか?
ありがとうございました!それは問題の面白いアプローチです。 –