"Традиционный" способ сделать это - иметь два семейства классов:
для самих объектов и для их фабрик.
В этом случае мои классы будут выглядеть так:
Код: Выделить всё
struct Base {
virtual void foo(/*...*/) = 0;
virtual ~Base() = default;
};
struct A: Base {
void foo(/*...*/) override;
};
struct BaseFactory {
virtual std::unique_ptr create(/*...*/) = 0;
};
struct AFactory : BaseFactory {
std::unique_ptr create(/*...*/) override; // returns pointer to A
};
std::map factories;
// this map gets filled somewhere, not the point of question
Если бы я хотел добавить новую реализацию Base, мне пришлось бы написать новую фабрику.
Однако я мог бы вообще избежать использования виртуальных функций для фабрики, используя карту функций:
Код: Выделить всё
std::map
Подробнее здесь: [url]https://stackoverflow.com/questions/79689860/is-there-any-reason-to-use-virtual-classes-for-factory-method-over-map-of-functi[/url]
Мобильная версия