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