Обычно объект завод создает экземпляры классов по телефонуфабрика объектов для перегруженных функций
auto world = ObjectFactory::instance()->create("MatrixTransform");
auto cube1 = ObjectFactory::instance()->create("Cube");
auto sphere = ObjectFactory::instance()->create("Sphere");
, которая использует карту зарегистрированных функций без параметров, таких, как этот, где класс Node
является базовым классом для классы MatrixTransform
, Cube
и Sphere
:
// Map of registered factory functions
std::map<std::string, std::function<Node *(void)>> functionRegistry;
Теперь я хотел бы зарегистрировать перегруженные конструкторы, принимая ограниченное число параметров (один или 2), такие как MatrixTransform(std::string objectName)
или MatrixTransform(std::string objectName, glm::mat4 matrixTransform)
, так что я могу назвать не только
auto world = ObjectFactory::instance()->create("MatrixTransform");
но
auto world = ObjectFactory::instance()->create("MatrixTransform", "world");
и даже
auto world = ObjectFactory::instance()->create("MatrixTransform", "world", "glm::mat4())");
Я знаю, что можно хранить в карте функций, имеющих различные сигнатуры, смысл функции, которые имеют разные параметры и/или типы возврата, но как регистрировать функции, которые имеют не только разные подписи, но и одно и то же имя, например, перегруженные конструкторы здесь выше, учитывая, что ключ на карте должен быть уникальным и, следовательно, не может быть повторен? При необходимости может быть отправлен весь заводской код объекта. Спасибо!
Вы уверены, что это не слишком сильно переработано? Есть ли * действительно * преимущество в простом создании объектов напрямую, без фабрики? Я не вижу в вашем примере, как завод бьет простой 'auto world = новый MatrixTransform (glm :: mat4())'. Я бы просто подумал об использовании 'std :: unique_ptr' вместо 'Node *'. –
@Christian Hackl У меня есть большое количество классов, разделяющих один и тот же базовый класс с конкретными экземплярами, которые необходимо создать во время выполнения, поэтому я начал с изучения шаблона фабрики объекта. И, конечно же, в конечном итоге будет использоваться 'std :: unique_ptr' вместо 'Node *'. –
LastBlow