为什么从vtkObjectBase
派生的vtk类具有受保护的构造函数,并且对象必须通过称为New
的静态方法在堆中实例化?
为什么选择这种设计,它的主要优点是什么?
这种模式称为"工厂方法"。以下是它的论据,按重要性降序排序(在我看来;在 VTK 中做出这些设计决策时我不在那里)。
- 允许多模行为,从而跨平台。当你这样做时
vtkRenderWindow* rw = vtkRenderWindow::New();
您实际上是在创建一些派生对象,例如 Linux/X11 上的 vtkXOpenGLRenderWindow 或 Windows 上的 vtkWin32OpenGLRenderWindow。该工具包通过各种系统检查(主要是在配置时)来解决这个问题,并为对象创建注入一个工厂,该工厂返回正确类型的对象。整个机器对用户是透明的,用户仅通过抽象基类指针使用对象。
- 受保护的 ctor 禁止在堆栈上分配对象,这会强制执行内存管理模型(通过 Un/Register()-ing,即 vtkObject 中的引用计数)。
- 语法一致性允许与模板一起使用,例如 vtkSmartPointer。
可能还有其他我现在想不出的原因。
希望这有帮助,
米罗