Я рассматриваю фабричную функцию для создания разных классов в одной и той же иерархии. Я понимаю, что обычно завод, как правило, реализуется следующим образом:Как объединить шаблон фабрики с гибкостью кода
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(...)));
функция может выглядеть примерно так:
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.
}
}
к сожалению, метод прототип работает только, если вы хотите только класс, созданный на заводе т o быть одинаковым каждый раз, поскольку он не поддерживает аргументы.
Кто-нибудь знает, можно ли это сделать красиво, или я придерживаюсь заводской функции?
Между, я надеюсь, что вы удалите этот человек где-то иначе У меня будет утечка памяти.;) – Partial