Насколько я понимаю, getTechnologyObject("string")
возвращает интеллектуальную ссылку / указатель типа std::shared_ptr<BasicChildTechnology>
на основе строки.Внутри этой функции есть список этих технических объектов, и только этот технический объект знает, связан ли он с этой строкой.
Первая проблема - эта строка.Возможно ли преобразовать его в перечисление или какой-то более точный тип данных раньше, чем сейчас?Уже одно это сделает вашу систему более надежной и быстрой.
Вторая проблема - это владение критериями соответствия.Я представляю, когда система разрабатывалась, это казалось естественным.Я хотел бы отметить, что этот объект не несет единой ответственности.И то, и другое должно быть выполнено независимо от того, что это за технология, и должно совпадать с каким-либо форматом сериализации.Возможно, все еще имеет смысл оставить строку внутри этого объекта (это может быть имя), но сопоставление должно быть поднято за пределы объекта и в функцию поиска getTechnologyObject("string")
.
Теперь независимо от того,у вас есть строка / число, техническим объектам нужна функция virtual label_t label()
(назовите ее по своему усмотрению), которая возвращает этот идентификатор.
В-третьих, каждый раз вы создаете новый объект.Это фабричный шаблон, но есть два варианта, как это реализовать.Один из них дает возможность клонировать каждую реализацию и рассматривать каждый экземпляр как прототип.Другой - создать связанную иерархию фабрик, которые строят эти технические объекты.
Если вы идете по пути прототипа, также определите virtual std::shared_ptr<BasicChildTechnology> clone() const =0;
в технических классах.В противном случае создайте связанное дерево классов TechnologyFactory
или шаблон Factory<T>
.Фабрике понадобится что-то вроде label_t label()
и std::shared_ptr<BasicChildTechnology> build()
.
Я собираюсь выбрать здесь прототип.
Построить поиск как:
std::map<label_t, std::shared_ptr<BasicChildTechnology>> lookup;
lookup.add(tech1->label(), tech1);
lookup.add(tech2->label(), tech2);
lookup.add(tech3->label(), tech3);
Тогда:
std::shared_ptr<BasicChildTechnology> getTechnologyObject(const label_t& label)
{
return lookup[label]->clone();
}
И шаблон фабрики здесь.
Создайте поиск следующим образом:
std::map<label_t, Factory<std::shared_ptr<BasicChildTechnology>>> lookup;
lookup.add(factory1->label(), factory1);
lookup.add(factory2->label(), factory2);
lookup.add(factory3->label(), factory3);
Тогда:
std::shared_ptr<BasicChildTechnology> getTechnologyObject(const label_t& label)
{
return lookup[label]->build();
}
в обоих случаях поиск выполняется в журнале (N).