Использование статического метода в C++ для реализации фабричного шаблона

Я относительно новый программист C++.
При написании некоторого кода я создал нечто похожее по концепции на код ниже. Когда друг указал, что на самом деле это фабричный шаблон, я прочитал о шаблоне и увидел, что он похож.

Во всех примерах я обнаружил, что шаблон фабрики всегда реализуется с использованием отдельного класса, такого как class BaseFactory{...}; а не так, как я реализовал это с помощью статического create() функция-член.

Мои вопросы:
(1) Это на самом деле фабричный образец?
(2) Код, кажется, работает. Есть ли что-то неправильное в том, как я это реализовал?
(3) Если моя реализация верна, каковы плюсы / минусы реализации статического create() функция в отличие от отдельного BaseFactory учебный класс.

Спасибо!

class Base {
    ...
    virtual ~Base() {}
    static Base* create(bool type);
}

class Derived0 : public Base {
    ...
};

class Derived1 : public Base {
    ...
};

Base* Base::create(bool type) {
    if(type == 0) {
        return new Derived0();
    }
    else {
        return new Derived1();
    }
}

void foo(bool type) {
    Base* pBase = Base::create(type);
    pBase->doSomething();
}

2 ответа

Решение

Это не типичный способ реализации фабричного шаблона, основная причина в том, что фабричный класс обычно не является базой создаваемых им классов. Распространенным руководством для использования наследования является "Убедитесь, что публичные модели наследования"is-a"". В вашем случае это означает, что объекты типа Derived0 или же Derived1 также должен быть типа Baseи производные классы должны представлять более специализированное понятие, чем Base.

Тем не менее, шаблон фабрики почти всегда включает наследование, так как фабрика будет возвращать указатель на базовый тип (вы тоже это делаете). Это означает, что клиентскому коду не нужно знать, какой тип объекта создан фабрикой, только то, что он соответствует интерфейсу базового класса.

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

С вашей фабрикой все в порядке, за исключением того, что вы объединили фабрику и интерфейс, нарушив принцип SRP.

Вместо создания статического метода create в базовом классе создайте его в другом (фабричном) классе.

Другие вопросы по тегам