それぞれ独自のコンストラクターを持ついくつかの派生クラスを持つクラスがあります。
class A
{
public:
static A *create_new_A(int child_ID);
member_data;
void method();
};
class A_child_0 : public A
{
A_child_0(int child_ID);
//stuff
};
class A_child_1 : public A
{
A_child_1(int child_ID);
//stuff
};
etc...
そしてメインファイルでは、これらは次のようなもので呼び出されます:
A **array;
array = new A *[nchildren];
for (int i = 0 ; i < nchildren ; i++)
{
array[i] = A->create_new_A( i );
}
ここで、A は次のようなファクトリです。
A* A::create_new_A(int child_ID)
{
if (child_ID == 0)
{
return new A_child_0(child_ID);
}
if (child_ID == 1)
{
return new A_child_1(child_ID);
}
}
A_child_n のコンストラクターが呼び出されると、現在、派生クラス間でわずかに異なる member_data 値の初期化内に一連の手続き型コマンドがあります。
A_child_0(int child_ID)
{
member_data.vector1[0] = 0;
for (i = 0; i < 200; i++)
member_data.vector2[0] = i;
read_in_conf_file("conf.txt")
// etc....
}
A_child_1(int child_ID)
{
member_data.vector1[0] = 0;
for (i = 0; i < 50; i++)
member_data.vector2[0] = i*i;
read_in_conf_file("conf.txt")
// etc....
}
私が興味を持っているのは、これを行うためのより良い方法があるかどうかです。今、私はこれらの手続き的なステップの多くをカプセル化することを考えているので、次のようになります
A_child_0(int child_ID)
{
initializer_class *intializer;
initializer->initialize(child_ID);
}
A_child_1(int child_ID)
{
initializer_class *intializer;
initializer->initialize(child_ID);
}
また、さまざまなクラスの初期化手順を実装するクラス initializer() があります。これは大まかに戦略パターンに触発されていると思います。このアプローチが適切か賢明かについて、誰か提案はありますか? それとも、問題をイニシャライザ クラスに委ねて、複雑なレイヤーを追加するだけですか。このようなことをするのが悪い考えである場合、コンストラクターが 1 つの長い C プログラムにならないようにするにはどうすればよいでしょうか?
編集: ファクトリが正しく指定されていないことを指摘した人もいます。私が示した例ではまだあまり洗練されていませんが、以前のものほど的外れではありません。