C++ 工厂对象与工厂函数

C++ 工厂对象与工厂函数,c++,design-patterns,factory,C++,Design Patterns,Factory,我有一个有几个派生类的ABC。要创建这些派生类,我使用factory模式: .h文件: class derivedFactory { public: base* createInstance(); }; base* derivedFactoryFunction(); .cpp文件: base* derivedFactory::createInstance() { return new derived(); } base* derivedFactoryFunction() {

我有一个有几个派生类的ABC。要创建这些派生类,我使用factory模式:

.h文件:

class derivedFactory
{
public:
    base* createInstance();
};
base* derivedFactoryFunction();
.cpp文件:

base* derivedFactory::createInstance()
{
    return new derived();
}
base* derivedFactoryFunction()
{
    return new derived();
}
与仅具有免费功能相比,这有什么优势:

.h文件:

class derivedFactory
{
public:
    base* createInstance();
};
base* derivedFactoryFunction();
.cpp文件:

base* derivedFactory::createInstance()
{
    return new derived();
}
base* derivedFactoryFunction()
{
    return new derived();
}
另外:我使用抽象工厂模式进行依赖注入。我可能会使用基于ABC的继承层次结构:

class objectCreator
{
public:
    base* create() = 0;
};
与函数指针相比,使用它有什么优势:

boost::function<base* ()> factory_ptr;
boost::函数工厂\u ptr;

使用boost::bind/lambda这似乎使我的代码更具可组合性,如果我愿意,我可以在其中包装一个真正的工厂对象。我可以看到性能可能会略有下降,但这很值得担心,因为它只在启动时被调用。

有一个与单个方法或方法指针的接口是等效的

但是在第二种情况下,如果你想让另一种方法与第一种方法同时使用,你会遇到麻烦

在我看来,接口比方法指针更具可读性


然后您选择了。

我想说,在类本身中将工厂函数作为静态方法的优势在于,它显然是该类生命周期的一部分。将其分离意味着使用您的类的其他程序员必须寻找其他地方才能找到工厂方法


很抱歉,我不确定将函数指针传递给factor方法的确切含义,但如果不需要,我通常不会使用函数指针。函数指针不能内联,因为它们不能在编译时解析,这意味着它们可能会更慢。但除此之外,如果您已经能够确定在编译时要调用哪个函数,那么使用函数指针似乎是一种糟糕的设计。

您是否希望一个类型有多个工厂?如果是这样,您需要factory对象。

这取决于您的工厂需要多大的灵活性。如果工厂需要外部信息(如来自配置文件、程序选项等)来确定如何构造对象,那么对象是有意义的。如果您所需要的只是工厂的参数,那么函数可能就可以了


拥有指针的唯一好处是用于测试,您可以使用不同的工厂函数。

指针将允许实现抽象工厂模式。我已经在上面展开了