我有一个带有几个派生类的ABC。要创建这些派生类,我使用工厂模式:
.h文件:
class derivedFactory
{
public:
base* createInstance();
};
.cpp文件:
base* derivedFactory::createInstance()
{
return new derived();
}
除了拥有免费功能外,这还有什么好处:
.h文件:
base* derivedFactoryFunction();
.cpp文件:
base* derivedFactoryFunction()
{
return new derived();
}
另外:我使用抽象工厂模式进行依赖注入。我可能会使用基于ABC的继承层次结构:
class objectCreator
{
public:
base* create() = 0;
};
在函数指针上使用它有什么好处:
boost::function<base* ()> factory_ptr;
使用boost :: bind / lambda这似乎使我的代码更易于组合,如果我希望我可以在其中包装一个真正的工厂对象。我可以看到可能会有轻微的性能下降,但这很令人担心,因为它只在启动时调用。
答案 0 :(得分:2)
这取决于您的工厂需要的灵活性。如果工厂需要外部信息(比如从配置文件,程序选项等)来确定如何构造对象,那么对象是有意义的。如果您需要的只是出厂参数,那么函数可能就好了。
我可以看到有一个指针的唯一优势是测试,你可以使用不同的工厂函数。
答案 1 :(得分:1)
具有单个方法的接口或指向方法的指针是等效的。
但是在第二种情况下,如果你想要另一种方法与第一种方法一起使用,你会遇到麻烦......
在我看来,界面比方法指针更具可读性。
然后你选择了。
答案 2 :(得分:1)
我认为将工厂函数作为类本身的静态方法的优点在于它很明显它是该类生命周期的一部分。将其分开意味着使用您的类的其他程序员必须在其他地方查找工厂方法。
对不起,我不确定通过将函数指针传递给factor方法的确切含义,但是如果你不需要,我通常不会使用函数指针。函数指针无法内联,因为它们无法在编译时解析,这意味着它们可能会更慢。但除此之外,如果您已经确定在编译时要调用哪个函数,那么使用函数指针似乎是不好的设计。
答案 3 :(得分:1)
您是否曾想要一种类型的工厂?如果是这样,您需要工厂对象。