C ++: может ли абстрактная фабрика обрабатывать шаблоны классов? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть иерархия классов, которая использует шаблон:

template <typename T>
class BaseClass
{
public:
    BaseClass(const std::string& inputName)
        :
        myMember(std::make_shared<T>(inputName))
    {}
private:
    const std::shared_ptr<T> myMember;
};

class UsedByDerived 
{
public:
    UsedByDerived(const std::string& inputName)
        :
        myInputName(inputName)
    {}
private:
    const std::string myInputName;
};

class DerivedClass : public BaseClass<UsedByDerived>
{
public:
    DerivedClass()
        :
        BaseClass<UsedByDerived>("X")
    {}
};

У меня есть несколько таких производных классов (каждый может иметь разные сигнатуры конструктора), и я хотел бы создать абстрактную фабрику для обработки экземпляров , Базовая фабрика

template <typename T>
class BaseFactory
{
public:
    virtual std::shared_ptr<BaseClass<T>> createProduct() = 0;
};

Мне интересно, как должен выглядеть производный фабричный класс (или это не сработает?), Однако неясно, как его следует реализовывать ...:

class DerivedFactory
{
public:
    std::shared_ptr<BaseClass</* what should this be? */>> createProduct()
    {
        // what should this return?
    }
};

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Существует небольшая точка, определяющая BaseFactory<T>, потому что BaseFactory<Derived1> - это отдельный тип для BaseFactory<Derived2>.

Аналогично BaseClass<T>. Различные экземпляры не являются взаимозаменяемыми.

0 голосов
/ 20 марта 2020

Как призовет методология python, Мы все здесь взрослые .. Вы можете создать шаблон фабричного класса. А вы должны?

Чтобы ответить на этот вопрос, вы должны учитывать, что парадигма Фабрики была разработана для обработки таких объектов, как автомобиль и автомобильный завод.

Вы получаете BMW с завода BMW. Когда он нуждается в обслуживании, вы возвращаете его на завод BMW. Фабрика будет обрабатывать модификации и исправления.

Если вы поедете на заводе Mercedes, BMW не будет вам очень доволен. Потому что они разработали свою машину, чтобы быть быстрой и безопасной. Мерседес просто хочет, чтобы это было безопасно. Поэтому они сократили ваш двигатель и сняли обвес. И теперь BMW уже не понимает, как починить машину, если она сломается. Так что фабрика BMW больше не работает.

Лучше иметь список из нескольких разных заводов, чем иметь один завод для списка из нескольких разных автомобилей.

Что может ослабить давление на искажение этого класса, тем не менее, это объединить фабричный шаблон с шаблоном посетителя или даже шаблоном декоратора. Или оба. Это позволит вам добавить ответственность к вашим классам, не меняя их.

Вы даже можете использовать шаблон «посетитель / декоратор» на фабриках.

...