Singleton, OSGi-Service und Extension in Eclipse-RCP

Das Entwurfsmuster Singleton, ein OSGi-Service und eine Eclipse-Extension können von einem Client dazu verwendet werden eine Instanz einer bestimmten Schnittstelle zu beziehen.

Singleton

Das Singleton ist der "klassische" Ansatz eine einmalige Instanz einer Schnittstelle zu beziehen. Dabei liefert eine statische Methode einen statischen Member aus. Die Methode stellt sicher, das genau eine Instanz einer Schnittstelle angelegt wird und nur diese ausgeliefert wird. Eine andere Möglichkeit an eine Instanz zu kommen gibt es nicht (abgesichert z. B. über einen privaten Konstruktor).

Eine Trennung von Schnittstelle und Implementierung ist nicht notwendig. Eine Klasse, das Singleton, kann sowohl die eigentliche Logik als auch den Zugriff auf die Instanz realisieren.

Die Abhängigkeit zu dem Plug-in, welches das Singleton bereitstellt ist hoch, jeder Client der das Singleton verwenden will, muss abhängig von diesem Plug-in sein.

Trennt man Schnittstelle und Implementierung, kann man die Implementierung in ein Fragment auslagern. Über Austausch des Fragment, kann man die Implementierung variieren. Ein OSGi-Service bietet hier eine flexiblere Lösung, die mehrere Instanzen sowie den Austausch der Implementierung zur Laufzeit erlaubt.

OSGi-Service

Ein OSGi-Service stellt die Implementierung einer Schnittstelle zur Verfügung. Jedes Bundle kann eine oder mehrere Instanzen dieser Schnittstelle veröffentlichen. Ein solcher Service steht nur zur Verfügung, wenn das Bundle aktiviert ist. Da in einer OSGi-Umgebung Bundles zur Laufzeit hinzugefügt und entfernt werden können, stellt ein Service die bessere Alternative zu einem Singleton dar.

Jeder Instanz eines OSGi-Services sind mehrere Eigenschaften (Properties) zugeordnet, eine davon istobjectClass, der Name der Schnittstelle des Services. Services können anhand dieser Eigenschaften gefunden werden, wobei sie einen Service nicht zwingend eindeutig identifizieren müssen. Man kann sich auf das Hinzufügen und Entfernen von Services anmelden, ebenso wie auf die Änderung der Service-Eigenschaften. Ein ServiceTracker stellt einen einfachen Weg dar einen Service zu überwachen.

Eclipse-Extension

Eclipse basiert auf OSGi und ergänzt die Plattform um Extension Points. Dies sind definierte Erweiterungspunkte mit denen deklarativ Eigenschaften festgelegt werden. Eine Extension ist eine konkreter Extension Point. Plugins können mit Extension Points definieren, wie sie erweitert werden können und mit Extensions andere Plugins erweitern.

Extensions können nicht nur (Text-)Eigenschaften in Form von XML deklarieren, sondern auch Java-Klassen adressieren. Die adressierten Klassen entsprechen einer im Extension Point bestimmten Schnittstelle. Mit Hilfe der IExtensionRegistry kann in Form von IConfigurationElement auf die Extensions zugegriffen werden und von einer adressierten Klasse eine Instanz angelegt werden. Dabei wird von Eclipse jedes mal eine neue Instanz angelegt, weshalb die Implementierung der Schnittstelle einen öffentlichen Standardkonstruktor besitzen muss.

Zurück