Design patterns vtk中的对象创建设计模式

Design patterns vtk中的对象创建设计模式,design-patterns,vtk,Design Patterns,Vtk,为什么从vtkObjectBase派生的vtk类具有受保护的构造函数,并且必须通过名为New的静态方法在堆中实例化对象 为什么选择这种设计?它的主要优点是什么?这种模式被称为“工厂方法”。以下是它的论点,按重要性递减顺序排列(在我看来,在VTK中做出这些设计决策时,我不在场) 允许多形态行为,从而实现跨平台。当你这样做的时候 vtkRenderWindow*rw=vtkRenderWindow::New(); 实际上,您正在创建一些派生对象,例如Linux/X11上的vtkXOpenGLR

为什么从
vtkObjectBase
派生的vtk类具有受保护的构造函数,并且必须通过名为
New
的静态方法在堆中实例化对象

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

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

  • 允许多形态行为,从而实现跨平台。当你这样做的时候
vtkRenderWindow*rw=vtkRenderWindow::New();

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

  • 受保护的构造函数禁止在堆栈上分配对象,这强制了内存管理模型(通过Un/Register()-ing,即VTKOObject中的引用计数)
  • 语法一致性允许与模板一起使用,例如vtkSmartPointer
可能还有其他我现在想不起来的原因

希望这有帮助


米罗

谢谢你的回答@mirni。关于第二点,我认为阻止堆栈分配并不是真正的优势。@iglesias在这种情况下,堆栈分配是不可取的。VTK用于大型数据集的可视化,在堆栈上执行大型数组的分配是不好的。这些库的设计目的是构建通常比堆栈范围更长的管道,数据集类由多个类的多个实例组成——如果允许其中任何一个在其所有者不知道或不响应的情况下消失,这将很难管理。