Применение паттернов проектирования: Фабрика
Разрабатывал я давеча свой Арканойд. С использованием библиотеки SFML. И вот передо мной стала задача реализации системы бонусов.
Само генерирование бонусов и их падение вниз особой проблемы не составило. Решил я реализовать под генерацию бонусов фабричный паттерн. Поскольку у меня уже была фабрики под генерацию блоков я решил, а почему бы не объединить эти блочные фабрики с бонусными в единую map.
Первой идеей было создание супер класса фабрики. От которого бы наследовались супер классы под фабрику блоков и фабрику бонусов, а там наследовались бы конкретные фабрики. Но столкнулся с такой проблемой, что под конструктор gameobject нужны дополнительные аргументы по типу расположение текстуры в файловой системе. А все наследуемые от gameobject'а классы принимали при создании только позицию. Можно было бы создать такой конструктор у gameobject, но тогда пришлось бы решать задачи, какие взять параметры для него.
И я пошел дальше. И нашёл вариант. Есть такая структура в c++ как std::variant. Она объединяет несколько типов данных в себе. Это решало сразу две задачи: и как объединить enum блоков и бонусов, и как объединить фабрики без создания супер класса. Решил я сделать map где ключом будет variant от enum блоков и бонусов, а значением variant от их фабрик. Но всё оказалось не так просто. Чтобы map работала с таким ключом нужно задать хэш функцию, ведь map использует хэш таблицы для быстрого доступа к значению по ключу. Провозился я с этой функцией и вроде как сделал. Но вот с тем, чтобы обратится к значению по ключу у меня возникли непреодолимые сложности. У меня просто не получалось ни записать, ни обратится к значениям в map. За давностью дней уже не помню нюансов. Возможно я просто не правильно понял применимость std::variant.
В итоге я отказался вообще от варианта объединения map фабрик блоков и бонусов, и разделил их на две разные переменные.