Я ищу интуитивно понятный и расширяемый способ реализации фабрик для подклассов заданного базового класса в С++. Я хочу предоставить такую функцию factory в библиотеке. Сложная часть заключается в том, что я хочу, чтобы упомянутый factory работал также для пользовательских подклассов (например, имея библиотеку factory), строит разные подклассы в зависимости от того, какие модули связаны с ним). Цель состоит в том, чтобы иметь минимальное бремя/путаницу для разработчиков, работающих ниже по течению, для использования заводов.
Пример того, что я хочу сделать, - это дать std::istream
, построить и вернуть объект любого подкласса, соответствующего содержанию, или нулевой указатель, если совпадений не найдено. Глобальный factory будет иметь такую подпись, как:
Base* Factory(std::istream &is){ ... };
Я знаком с прототипами фабрик, но я предпочитаю избегать необходимости создавать/хранить объекты-прототипы. Связанный вопрос размещен здесь для java: Разрешить максимальную гибкость/расширяемость с помощью factory.
Я не ищу С++ 11 -специфические решения на данный момент, но если они более элегантны, я был бы рад узнать об этом.
Я придумал одно рабочее решение, которое, я считаю, довольно элегантно, и я отправлю его в качестве ответа. Я могу представить, что эта проблема довольно распространена, поэтому мне интересно, знает ли кто-нибудь о лучших подходах.
РЕДАКТИРОВАТЬ: кажется, что некоторые уточнения в порядке...
Идея состоит в том, чтобы factory построил объект производного класса, не содержащий логики, чтобы решить, какой из них. Хуже того, метод factory окажется частью библиотеки, а производные классы могут быть определены в плагинах.
Производные классы должны быть в состоянии сами решить, подходят ли они для построения, на основе предоставленного ввода (например, входного файла). Это решение может быть реализовано как предикат, который может использоваться factory, как было предложено несколькими людьми (большое предложение, кстати!).