元素 Factory

根據工作台關閉期間所儲存的資料來重建工作台模型物件的元素 Factory。

在仔細查閱元素 Factory 延伸前,必須檢視整個平台中所使用的一項一般技術,以 將外掛程式特定的行為新增至通用平台模型物件。

IAdaptables 和工作台配接器

當瀏覽各種工作台類別時,您會注意到許多工作台介面延伸 IAdaptable 介面。

外掛程式使用配接器來將特定的行為新增至系統中預先存在的類型。 例如,為顯示目的,工作台可能要資源回應標籤和影像。 我們知道將 UI 特定的行為新增至低層次物件並不是好的設計方式 ,所以要如何將這個行為新增至資源類型呢?

外掛程式可登錄將行為新增至預先存在類型的配接器。 然後應用程式程式碼可以查詢特定配接器的物件。如果已有為該物件登錄的 配接器,應用程式可取得該配接器並使用定義於其中的新行為。

藉由提供機能於配接器中動態查詢某個物件,在發展系統時可以增進系統彈性。 新外掛程式可針對平台類型來登錄新配接器,而不需要變更程式類型的定義。 下列是型樣向特定配接器要求的物件:

   //給定一個物件 o,我們想對它執行一些「工作台」的工作。
   if (!(o instanceof IAdaptable)) {
         return null;
   }
IWorkbenchAdapter adapter =
(IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);   if (adapter == null)
         return null;
// 現在我可以把 o 當作 IWorkbenchAdapter   ...

如果沒有手動對物件登錄配接器,則會傳回 null 為配接器。用戶端必須準備處理這 個情況。可能有幾次尚未登錄預期的配接器。

工作台使用配接器來從基礎平台類型取得 UI 資訊,這個類型如 IResource。 配接器從特定 UI 知識投影基礎類型,讓工作台發展它的介面,而不需要變更基礎類型定義。

若無配接器,則任何可能來回遞入工作台 API 的類別必須實作 UI 介面,因而會增加類別定義的數目, 引入緊密的配對並建立核心與 UI 類別之間的循環相依關係。 有了配接器,每一個類別可實作 IAdaptable 及使用配接器登錄來讓外掛程式擴充基礎類型的行為。

在整個工作台程式碼中,您會看到在配接器查詢平台核心類型的情況。這個查詢是為了取得知 道如何回應有關類型的 UI 導向資訊之物件。

元素 Factory

當使用者關閉了工作台,必須儲存工作台中顯示的 IAdaptable 物件現行狀態。利用特定格式物件的初始參數儲存物件的狀態, IMemento。 也會儲存由 IMemento 重建物件的 Factory ID, 而資料也儲存在檔案系統中。

當重新啟動平台後,工作台會尋找與 IMemento 的 Factory ID 相關聯的元素 Factory。 尋找 Factory 的方法是在外掛程式登錄中檢查 org.eclipse.ui.elementFactories 延伸的組件。

標記十分簡單。我們只需要指定 Factory ID 和實作 Factory 的對應類別。

下列程式碼片段來自工作台 plugin.xml

   <extension
         point="org.eclipse.ui.elementFactories">
      <factory
            class="org.eclipse.ui.internal.model.ResourceFactory"
            id="org.eclipse.ui.internal.model.ResourceFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.model.WorkspaceFactory"
            id="org.eclipse.ui.internal.model.WorkspaceFactory">
      </factory>
      <factory
            class="org.eclipse.ui.part.FileEditorInputFactory"
            id="org.eclipse.ui.part.FileEditorInputFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory"
            id="org.eclipse.ui.internal.dialogs.WelcomeEditorInputFactory">
      </factory>
      <factory
            class="org.eclipse.ui.internal.WorkingSetFactory"
            id="org.eclipse.ui.internal.WorkingSetFactory">
      </factory>
</extension>