首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工厂对象与工厂函数

工厂对象与工厂函数
EN

Stack Overflow用户
提问于 2009-02-11 11:58:30
回答 4查看 3.7K关注 0票数 6

我有一个带有几个派生类的ABC。为了创建这些派生类,我使用了工厂模式:

.h文件:

代码语言:javascript
复制
class derivedFactory
{
public:
    base* createInstance();
};

.cpp文件:

代码语言:javascript
复制
base* derivedFactory::createInstance()
{
    return new derived();
}

与只有一个免费函数相比,这样做有什么好处:

.h文件:

代码语言:javascript
复制
base* derivedFactoryFunction();

.cpp文件:

代码语言:javascript
复制
base* derivedFactoryFunction()
{
    return new derived();
}

另外:我使用抽象工厂模式进行依赖注入。我可以使用基于ABC的继承层次结构:

代码语言:javascript
复制
class objectCreator
{
public:
    base* create() = 0;
};

与函数指针相比,使用此函数有什么优势:

代码语言:javascript
复制
boost::function<base* ()> factory_ptr;

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-02-11 12:08:48

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

我所能看到的拥有指针的唯一优点是用于测试,在那里您可以使用不同的工厂函数。

票数 2
EN

Stack Overflow用户

发布于 2009-02-11 12:04:40

具有单个方法的接口或指向方法的指针是等效的。

但是在第二种情况下,如果你想在第一种方法的基础上使用另一种方法,你会遇到麻烦的。

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

然后你选择了。

票数 1
EN

Stack Overflow用户

发布于 2009-02-11 12:05:07

我要说的是,让工厂作为类本身的静态方法的好处是,很明显,它是该类生命周期的一部分。将其分开意味着使用您的类的其他程序员将不得不寻找其他地方来查找工厂方法。

很抱歉,我不确定传递函数指针到factor方法到底是什么意思,但如果没有必要,我通常不会使用函数指针。函数指针不能内联,因为它们不能在编译时解析,这意味着它们可能会更慢。但除此之外,如果你已经可以确定在编译时要调用哪个函数,那么使用函数指针似乎是一个糟糕的设计。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/536464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档