考虑以下接口(使用哑指针,因为我们还在 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 更加困难。我应该相信我的感觉吗?什么情况下自由方法作为抽象工厂接口的一部分是合理的?