次のインターフェイスを検討してください (まだ 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 に違反し、unique_ptr への移行を (今後 20 年間で私たちの組織ではありそうもないことですが) 困難にします。自分の気持ちを信じるべきですか?抽象ファクトリ インターフェイスの一部としてのフリー メソッドが正当化されるのはどのような場合ですか?