Плохо ли использовать пустой базовый класс для принудительного наследования абстрактной фабрики? - PullRequest
0 голосов
/ 16 мая 2018

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

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

1 Ответ

0 голосов
/ 16 мая 2018

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

Вам не нужно "empty_base_factory", если оно просто пустое.

В шаблоне дизайна Abstract Factory :

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

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

Возвращаясь к вашему вопросу: он на самом деле не связан с шаблоном проектирования Абстрактной фабрики.

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

...