@MuffinLover

Как грамотно переписать фабрику?

подскажите, пожалуйста как это грамотно переписать, чтобы
1) В идеале чтобы не делать целую строчку при добавлении стратегии, а класть просто в какой-то вектор
2) Чтобы создавалась только та стратегия, которая нужна и каждый раз для одинаковой стратегии создавался новый объект
в идеале как-то чтобы по строке наверное создавать
хотя не уверен норм ли идея
Сам код
namespace Strategies {
using std::unique_ptr;
std::unique_ptr<Strategy> StrategyFactory::create(const std::string &className) {
  std::map<std::string, std::unique_ptr<Strategy>> strategiesMap;
  strategiesMap.try_emplace("random", unique_ptr<Strategy>(new AlwaysRandom));
  strategiesMap.try_emplace("always_defect", unique_ptr<Strategy>(new AlwaysDefeat));
  strategiesMap.try_emplace("always_collude", unique_ptr<Strategy>(new AlwaysCollude));
  strategiesMap.try_emplace("grudger", unique_ptr<Strategy>(new Grudger));
  strategiesMap.try_emplace("copycat", unique_ptr<Strategy>(new CopyCat));
  strategiesMap.try_emplace("detective", unique_ptr<Strategy>(new Detective));
  auto it = strategiesMap.find(className);
  if (it != strategiesMap.end()) {
    return std::move(it->second);
  }
  throw std::runtime_error("no strategy found with this name: " + className);
}
}
  • Вопрос задан
  • 83 просмотра
Решения вопроса 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
У стратегий можно сделать статические методы. Например, метод, возвращающий имя, и метод, создающий экземпляр класса.

В вектор/мап кладите пары stragetyX.GetName(), &stategyX.CreateStrategy
А дальше находите там нужную строку и вызывайте функцию-фабрику.

Но вообще, такие штуки c хранением функций-фабрик в контейнере редко делают. Можно в одном месте и иметь вереницу из if-else. Будет не одна длинная строчка на каждый новый класс, а две но покороче.
Ответ написан
@MarkusD Куратор тега C++
все время мелю чепуху :)
Однажды я уже показывал как могла бы выглядеть абстрактная фабрика.
Абстракция там достигается за счет реконфигурируемости самой фабрики.
Показанная там реализация служит хорошим примером и позволяет понять общий подход, но не годится для использования в настоящем коде. Эту реализацию нужно дорабатывать уже под свои нужды.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы