У меня есть класс с именем A, и я говорю несколько унаследованных классов, основанных на A. Я не включаю их здесь, чтобы сэкономить место, но также предполагаю, что у нас есть производные классы для A, которые потребуют фабрики.То же самое для класса B.
struct A
{
...
};
struct B
{
...
};
// start of factory code
//
struct empty_base_factory
{
};
struct factoryA : public empty_base_factory
{
shared_ptr<A> make_object() { return ... }
};
struct factoryB : public empty_base_factory
{
shared_ptr<B> make_object() { return ... }
};
class abstract_factory
{
std::map< uint8_t, std::shared_ptr<empty_base_factory> > iv_factories;
public:
abstract_factory()
{
iv_factories[0] = make_shared<factoryA>();
iv_factories[1] = make_shared<factoryB>();
// .. I might several more similar to this
}
std::shared_ptr<empty_base_factory> make_factory(const uint8_t i_key)
{
return iv_factories[i_key];
}
};
Такое ощущение, что я заставляю неестественное наследование с помощью empty_base_factory, чтобы эта реализация, которую я нашел в книге, работала хорошо.Было бы целесообразно, чтобы make_object был методом интерфейса, чтобы сделать empty_base_factory интерфейсом, но тип возвращаемого значения make_object отличается, и я не уверен, как с этим справиться.
Это плохой способ реализацииабстрактная фабрика, заставляющая использовать пустой базовый класс?Мысли