2017-04-19 27 views
0

为什么衍生自vtkObjectBase的vtk类具有受保护的构造函数,并且对象必须通过名为New的静态方法在堆中实例化?vtk中的对象创建设计模式

为什么选择这种设计,它的主要优点是什么?

回答

1

这种模式被称为“工厂方法”。下面是它的论点,按照重要性递减排序(在我看来,当VTK做出这些设计决策时我不在那里)。

  • 允许polymorhic行为,从而跨平台性。当你做

vtkRenderWindow* rw = vtkRenderWindow::New();

您实际上是创建一些派生的对象,例如在Linux/X11上的vtkXOpenGLRenderWindow或在Windows上的vtkWin32OpenGLRenderWindow。该工具包通过各种系统检查(主要是在配置时)进行计算,并为对象创建注入工厂,以返回正确类型的对象。整个机器对用户来说是透明的,用户只通过抽象基类指针来使用对象。

  • 受保护的ctors禁止在堆栈上分配对象,这会强制执行内存管理模型(通过Un/Register(),即vtkObject中的引用计数)。
  • 语法一致性允许与模板一起使用,例如vtkSmartPointer。

可能还有其他原因,我现在想不出来。

希望这有助于

米罗

+0

谢谢您的回答@mirni。关于第二点,我认为防止堆栈分配并不是真正的优势。 – iglesias

+0

@iglesias在这种情况下,堆栈分配是不可取的。 VTK用于大型数据集的可视化,并且在堆栈上执行大型数组的分配将会很糟糕。这些库的设计目的是构建通常比堆栈范围寿命更长的管道,而数据集类则由多个类的多个实例组成 - 如果允许任何这些实例消失而没有其所有者知道或做出响应,则这些实例将很难管理。 – Drone2537