Плохо ли использовать пустой базовый класс для принудительного наследования абстрактной фабрики?

У меня есть класс с именем 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 отличается, и я не уверен, как с этим справиться.

Это плохой способ попытаться реализовать абстрактную фабрику, заставив использовать пустой базовый класс? Мысли?

0

Решение

Это плохой способ попытаться реализовать абстрактную фабрику
форсировать использование пустого базового класса? Мысли?

Тебе не нужноempty_base_factory«Если это просто пусто.

в Абстрактная Фабрика дизайн шаблона:

Абстрактный шаблон фабрики обеспечивает способ инкапсулировать группу
отдельные фабрики, которые имеют общую тему без указания их
конкретные классы

В твоем случае: abstract_factory зависит от factoryA а также factoryB (которые являются вашими конкретными фабриками) для создания конкретного объекта. Пользователь ничего не знает о существовании этих конкретных фабрик.

Возвращаясь к вашему вопросу: он не имеет отношения к шаблону проектирования Abstract Factory.

Там нет остановки для определения абстрактного базового класса, BaseFactory, которая определяет основные функциональные возможности фабрики (например, make_object()). Виртуальные функции в BaseFactory это то, что ваши конкретные заводы должны реализовать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]