У меня есть класс с именем 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 отличается, и я не уверен, как с этим справиться.
Это плохой способ попытаться реализовать абстрактную фабрику, заставив использовать пустой базовый класс? Мысли?
Это плохой способ попытаться реализовать абстрактную фабрику
форсировать использование пустого базового класса? Мысли?
Тебе не нужноempty_base_factory
«Если это просто пусто.
в Абстрактная Фабрика дизайн шаблона:
Абстрактный шаблон фабрики обеспечивает способ инкапсулировать группу
отдельные фабрики, которые имеют общую тему без указания их
конкретные классы
В твоем случае: abstract_factory
зависит от factoryA
а также factoryB
(которые являются вашими конкретными фабриками) для создания конкретного объекта. Пользователь ничего не знает о существовании этих конкретных фабрик.
Возвращаясь к вашему вопросу: он не имеет отношения к шаблону проектирования Abstract Factory.
Там нет остановки для определения абстрактного базового класса, BaseFactory
, которая определяет основные функциональные возможности фабрики (например, make_object()
). Виртуальные функции в BaseFactory
это то, что ваши конкретные заводы должны реализовать.
Других решений пока нет …