2017-04-19 69 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