Рассмотрим следующий интерфейс (используются тупые указатели, потому что мы все еще в C++98)
class WidgetMaker {
virtual Widget* makeWidget() = 0;
};
При следующей вероятной реализации
class SpecificWidgetMaker: public WidgetMaker {
Widget* makeWidget() {
return new SpecificWidget();
}
};
Widget — это некий базовый класс с виртуальным деструктором, SpecificWidget расширяет его. Мои коллеги утверждают, что интерфейс WidgetMaker должен содержать следующий метод
virtual void freeWidget(Widget* widget);
Обоснование заключается в том, что таким образом мы не заставляем реализации makeWidget использовать стандартное новое распределение, они могут использовать настраиваемый распределитель пула или всегда возвращать один и тот же глобальный экземпляр в случае, если виджет не имеет состояния или что-то еще.
Я считаю такой дизайн вообще плохой идеей - он усложняет клиентский код, нарушает KISS и YAGNI, затрудняет переход (что маловероятно в нашей организации в ближайшие 20 лет) на unique_ptr. Должен ли я доверять своим чувствам? В каких случаях оправдан свободный метод как часть интерфейса абстрактной фабрики?