从工厂返回静态或动态分配的对象?

时间:2014-10-15 17:17:04

标签: c++ memory memory-management new-operator factory

基本上,这个:

Cat CatFactory::CreateCat()
{
    return Cat();
}

或者这个:

Cat* CatFactory::CreateCat()
{
    return new Cat();
}

我知道一般的建议是尽可能避免使用new,并倾向于在堆栈上更喜欢创建对象,这样就不必使用delete。这也适用于工厂吗?我看到的所有示例都倾向于使用new关键字。为什么会这样?

我无法使用智能指针,因为这是一个类项目,每个人都是C ++的新手,我们必须在以后集成我们的项目。

2 个答案:

答案 0 :(得分:4)

  

我看到的所有示例都倾向于使用new关键字。为什么会这样?

因为工厂模式通常用于避免将构造函数和类层次结构(许多系统中的实现细节)的知识泄露给调用者;如果你要返回Cat的子类而不是Cat的实例,你想使用它:

Cat *make_cat(int type)
{
    switch (type) {
        case TABBY:
            return new Tabby();
        case TORTOISESHELL:
            return new Tortoiseshell();
        // etc.
    }
};

如果按价值返回,则无法执行此操作。

按值返回的其他原因包括不可复制的对象。如果您不喜欢使用原始指针,并且现代C ++样式应该使用原始指针,请返回unique_ptrshared_ptr

答案 1 :(得分:0)

这完全取决于你在应用程序上下文中的“对象”(在abstarct意义上)是什么意思,你如何识别它,以及多态必须对它有什么作用。

如果您的对象不需要是多态的,并且您可以通过值来识别它们,您可以按值传递它们(或者在C ++ 11中“移动”它们),所以 - 事实上 - 您可以使用“价值论语“。 在这种情况下,两个包含“abc”的变量都是“相等的”,并被认为在不同的地方(范围)代表“相同的东西”。

如果你通过它们在内存中的位置(a.k.a.地址)来识别对象,那么就不必传递指针或引用,这样就不会复制。在这种情况下,包含“abc”的两个不同变量被认为是“代表不同的东西,偶然看起来相同”。

如果需要多态,则必须通过指针(或通过引用,而不是值)传递,因为C ++多态通过间接操作。

基于OOP的程序倾向于遵循第二范式。 功能或通用程序往往遵循第一个。

这里的要点是,“工厂模式”是一种OOP技术,在OOP世界之外并不那么有趣。