例如,假設您想要執行工廠模式。爲什麼這樣做:爲什麼在使用函數引用時使用仿函數
class IFooFactory {
public:
virtual ~IFooFactory() {}
virtual std::unique_ptr<IFoo> operator()(int bar, int baz) const = 0;
};
class AFactory : public IFooFactory {
public:
virtual std::unique_ptr<IFoo> operator()(int bar, int baz) const override {
std::unique_ptr<IFoo> a(new A(bar, baz));
return a;
}
};
class BFactory : public IFooFactory {
public:
virtual std::unique_ptr<IFoo> operator()(int bar, int baz) const override {
std::unique_ptr<IFoo> b(new B(bar, baz));
return b;
}
};
void doStuff() {
std::unique_ptr<IFooFactory> fooFactory(new BFactory);
doMoreStuff(fooFactory);
}
時,你可以這樣做:
typedef std::unique_ptr<IFoo> (&FooFactory)(int bar, int baz);
std::unique_ptr<IFoo> AFactory(int bar, int baz) {
std::unique_ptr<IFoo> a(new A(bar, baz));
return a;
}
std::unique_ptr<IFoo> BFactory(int bar, int baz) {
std::unique_ptr<IFoo> b(new B(bar, baz));
return b;
}
void doStuff() {
doMoreStuff(BFactory);
}
什麼是第一個解決方案的優勢是什麼?它看起來像是令人費解的OO廢話給我。
所以如果不需要本地狀態,那麼第二個更好? – grasevski
我這麼認爲。這取決於你有多確定它將來不再需要,以及一些估計,如果你碰巧是錯的,那麼改變它的代價是什麼。例如,如果接口將被某個庫公開,供其他人使用,那麼最好使用更通用的接口。另一方面,你通常應該避免過度設計事物。通常看起來更一般的界面由於您未預期的需求變化而在開發後期仍然不足。 – NonNumeric