同じ階層に異なるクラスを作成するためのファクトリ関数を検討しています。私は次のように通常の工場が正常に実装されていることを理解する:ファクトリパターンをコードの柔軟性と組み合わせるにはどうすればいいですか
Person* Person::Create(string type, ...)
{
// Student, Secretary and Professor are all derived classes of Person
if (type == "student") return new Student(...);
if (type == "secretary") return new Secretary(...);
if (type == "professor") return new Professor(...);
return NULL;
}
私は様々な条件がハードコードされている必要はありませんように、プロセスを自動化することができるように方法を考えるしようとしています。
これまでのところ私は考えることができる唯一の方法は、地図とプロトタイプパターンを使用している:
最初の要素を入力文字列と第二のクラスのインスタンス(試作品)を保持しますマップ:
をstd::map<string, Person> PersonClassMap;
// This may be do-able from a configuration file, I am not sure
PersonClassMap.insert(make_pair("student", Student(...)));
PersonClassMap.insert(make_pair("secondary", Secretary(...)));
PersonClassMap.insert(make_pair("professor", Professor(...)));
関数は次のようになります。あなたが唯一の工場tで作成したクラスをしたい場合は
Person* Person::Create(string type)
{
map<string, Person>::iterator it = PersonClassMap.find(type) ;
if(it != PersonClassMap.end())
{
return new Person(it->second); // Use copy constructor to create a new class instance from the prototype.
}
}
残念ながら、プロトタイプの方法でのみ動作します引数をサポートしていないので、毎回同じである。
いい方法でそれを行うことが可能かどうか誰かが知っていますか、または私は工場の機能についていますか?
私はあなたがどこかそうでなければ、その人を削除願って、間いくつかのメモリが漏れています;) – Partial