2009-02-11 180 views
6

我有一个带有几个派生类的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 ::绑定/λ,这似乎让我的代码更多的可组合,如果我希望我可以包装一个真正的工厂对象。我可以看到,性能可能会有所下降,但这很值得担忧,因为它只是在启动时调用。

回答

2

这取决于你的工厂需要多么灵活。如果工厂需要外部信息(如来自配置文件,程序选项等)来确定如何构建对象,则比对象更合理。如果你所需要的只是在工厂的争论中,那么比起一个函数来说可能是好的。

我可以看到有一个指针的唯一好处是用于测试,您可以在其中使用不同的工厂函数。

+0

指针将允许实现抽象工厂模式。我已经在上面扩展了它 – 2009-02-17 09:50:33

1

具有与单一方法或指向方法的指针的接口是等价的。

但是在第二种情况下,你会惹上麻烦,如果你想其他方法来与疗法第一个走......

和界面比在我看来方法指针更具可读性。

然后你选择了。

1

我想说的是将工厂函数作为类中的静态方法的好处在于,很明显它是该类生命周期的一部分。将它分开意味着其他使用你的类的程序员必须寻找别的地方才能找到工厂方法。

对不起,我不确定你的意思是通过传递函数指针到factor方法,但是如果你不需要,我通常不会使用函数指针。函数指针不能被内联,因为它们在编译时不能被解析,这意味着它们可能会变慢。但除此之外,如果您已经确定在编译时将调用哪个函数,那么使用函数指针似乎就不太好。

1

你是否想过一种类型的工厂?如果是这样,你需要工厂对象。