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


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

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

Мои вопросы:
(1) Является ли это на самом деле a фабричный образец?
(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 3

2 ответа:

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

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

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

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

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