基本上,这个:
Cat CatFactory::CreateCat()
{
return Cat();
}
或者这个:
Cat* CatFactory::CreateCat()
{
return new Cat();
}
我知道一般的建议是尽可能避免使用new,并倾向于在堆栈上更喜欢创建对象,这样就不必使用delete。这也适用于工厂吗?我看到的所有示例都倾向于使用new关键字。为什么会这样?
我无法使用智能指针,因为这是一个类项目,每个人都是C ++的新手,我们必须在以后集成我们的项目。
答案 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_ptr
或shared_ptr
。
答案 1 :(得分:0)
这完全取决于你在应用程序上下文中的“对象”(在abstarct意义上)是什么意思,你如何识别它,以及多态必须对它有什么作用。
如果您的对象不需要是多态的,并且您可以通过值来识别它们,您可以按值传递它们(或者在C ++ 11中“移动”它们),所以 - 事实上 - 您可以使用“价值论语“。 在这种情况下,两个包含“abc”的变量都是“相等的”,并被认为在不同的地方(范围)代表“相同的东西”。
如果你通过它们在内存中的位置(a.k.a.地址)来识别对象,那么就不必传递指针或引用,这样就不会复制。在这种情况下,包含“abc”的两个不同变量被认为是“代表不同的东西,偶然看起来相同”。
如果需要多态,则必须通过指针(或通过引用,而不是值)传递,因为C ++多态通过间接操作。
基于OOP的程序倾向于遵循第二范式。 功能或通用程序往往遵循第一个。这里的要点是,“工厂模式”是一种OOP技术,在OOP世界之外并不那么有趣。