Elementfabrikker

Elementfabrikker bruges til at genskabe arbejdsbænkmodelobjekter ud fra data, der gemt under afslutningen af arbejdsbænken.

Før der ses nærmere på elementfabrikudvidelsen, er det nødvendigt at gennemgå en generel teknik, der bruges på hele platformen til at tilføje plugin-funktionsmåder til generelle platformsmodelobjekter.

IAdaptables og arbejdsbænkadaptere

Når du blader i de forskellige arbejdsbænkklasser, vil du bemærke, at mange af arbejdsbænkens grænseflader udvider IAdaptable-grænsefladen.

Plugins bruger adaptere til at tilføje en specifik funktionsmåde til allerede eksisterende typer i systemet. Arbejdsbænken kan f.eks. have brug for ressourcer til at svare med en etiket og et billede af hensyn til fremvisningen. Det er ikke godt design at tilføje en brugergrænsefladespecifik funktionsmåde til objekter på lavt niveau, men hvordan kan funktionsmåden så blive tilføjet til ressourcetypen?

Plugins kan registrere adaptere, som tilføjer funktionsmåde til allerede eksisterende typer. Programkoden kan derefter forespørge et objekt om en bestemt adapter. Hvis der findes en, der er registreret for det, kan programmet hente adapteren og bruge de nye funktionsmåder, der er defineret i adapteren.

Ved at stille en facilitet til rådighed, som dynamisk forespørger om en adapter for et objekt, kan systemets fleksibilitet forbedres, efterhånden som det udvikles. Der kan registreres nye adaptere for platformstyper med nye plugins, uden at det er nødvendigt at ændre definitionerne af de oprindelige typer. Mønstret til at spørge et objekt om en bestemt adapter er følgende:

   //vi har objektet o, som vi vil gøre "arbejdsbænkting" med.
   if (!(o instanceof IAdaptable)) {
         return null;
   }
   IWorkbenchAdapter adapter = (IWorkbenchAdapter)o.getAdapter(IWorkbenchAdapter.class);
   if (adapter == null)
         return null;
   // vi kan nu behandle o som en IWorkbenchAdapter
   ...

Hvis der ikke er en registreret adapter for objektet til rådighed, returneres null som adapteren. Klienterne skal være forberedt på at håndtere dette tilfælde. Der kan være tilfælde, hvor en forventet adapter ikke er registreret.

Arbejdsbænken bruger adaptere til at hente oplysninger om brugergrænsefladen fra basisplatformstyperne, så som IResource. Adaptere afskærmer basistyperne fra brugergrænsefladespecifik viden og tillader arbejdsbænken at udvikle sine grænseflader uden at ændre definitionerne af basen.

Hvis der ikke var adaptere, skulle klasser, der sendes rundt i arbejdsbænks-API'et, implementere brugergrænsefladerne, hvilket ville øge antallet af klassedefinitioner, introducere tæt kobling og skabe cirkulære afhængigheder mellem kernen og brugergrænsefladeklasserne. Med adaptere implementerer hver klasse IAdaptable og bruger adapterregistreringsdatabasen til at tillade, at plugins udvider basistypernes funktionsmåde.

Der er i hele koden til arbejdsbænken tilfælde, hvor en platformskernetype bliver spurgt om en adapter. Forespørgslen bruges til at hente et objekt, som ved, hvordan der skal besvares brugergrænsefladeorienterede oplysninger om typen.

Elementfabrikker

Når brugeren afslutter arbejdsbænken, skal den gemme den nuværende tilstand af de IAdaptable-objekter, der er vist på arbejdsbænken. Et objekts tilstand lagres ved at gemme objektets primitive dataparametre i et specielt format, som kaldes IMemento. Id'en for en fabrik, som kan genskabe objektet ud fra et IMemento, gemmes også, og dataene gemmes i filsystemet.

Når platformen genstartes, finder arbejdsbænken den elementfabrik, der er knyttet til IMemento'ets fabriks-id. Den finder fabriks-id'en ved at undersøge, om plugin-registreringsdatabasen indeholder bidrag til udvidelsen org.eclipse.ui.elementFactories.

Koden er forholdsvis enkel. Det er kun nødvendigt at angive fabriks-id'en og den tilsvarende klasse, som implementerer fabrikken.

Følgende kode er hentet fra arbejdsbænkens 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>