Design Pattern #4

Autor: NathalieOhneHerz GitHub

Das Service Locator Pattern

Lokalisieren, anvisieren und eliminieren.


Hauptartikel: [Design Pattern #1] Was sind die Design patterns


Im Folgenden soll das "Service Locator Pattern" näher beleuchtet werden.

Was ist das Service Locator Pattern und wann verwendet man es?

Häufig in Bibliotheken verwendet soll das Service Locator Pattern jederzeit gewisse Dienste zur Verfügung stellen. Es gehört dabei zu den komplexeren und umfangreicheren Pattern und lässt sich in die Kategorie Bekannt ist eine Implementation dieses Patterns sicher auch aus dem Bukkit Bereich: https://hub.spigotmc.org/javad…ugin/ServicesManager.html - Man will damit Dienste innerhalb einer Laufzeitumgebung bereit stellen. Innerhalb eines Programmes sollen Dienste wie zum Beispiel Vault am Beispiel von Bukkit implementiert werden.
In manchen Implementationen wird der Service Locator außerdem um einen Cache erweitert. Beispiel siehe: [Design Pattern #4.1] Das Service Locator Pattern mit Cache


Modellierung


Implementierung in Java

Anmerkung: Wenn ihr im folgenden Beispiel ein weiteres Design Pattern entdeckt dann schreibt es in die Kommentare.

package de.nathalieoneill.devtek.service; /** * @author Nathalie */ public interface Service { }
package de.nathalieoneill.devtek.service.impl; import de.nathalieoneill.devtek.service.Service; /** * @author Nathalie */ public class AccountService implements Service { public void setAccountEmail(String accountName, String accountEmail) { System.out.println("Setting email: " + accountName + " " + accountEmail); } }
package de.nathalieoneill.devtek.service.impl; import de.nathalieoneill.devtek.service.Service; /** * @author Nathalie */ public class UserService implements Service { public void createUser(String name) { System.out.println("Creating User " + name); } }
package de.nathalieoneill.devtek.service; import de.nathalieoneill.devtek.service.impl.AccountService; import de.nathalieoneill.devtek.service.impl.UserService; /** * @author Nathalie */ public class ServiceContext { public Service lookup(Class<? extends Service> serviceClass) { if (serviceClass == AccountService.class) return new AccountService(); else if (serviceClass == UserService.class) return new UserService(); return null; } }
package de.nathalieoneill.devtek.service; /** * @author Nathalie */ public class ServiceLocator { public static <T extends Service> T getService(Class<? extends Service> clazz) { return (T) new ServiceContext().lookup(clazz); } }

Die Verwendung sähe wie folgt aus:

package de.nathalieoneill.devtek; import de.nathalieoneill.devtek.service.ServiceLocator; import de.nathalieoneill.devtek.service.impl.AccountService; import de.nathalieoneill.devtek.service.impl.UserService; /** * @author Nathalie */ public class DevTek { public static void main(String[] args) { AccountService accountService = ServiceLocator.getService(AccountService.class); accountService.setAccountEmail("Nathalie", "Trash@Tash.tsh"); UserService userService = ServiceLocator.getService(UserService.class); userService.createUser("Nathalie"); } }

Ich hoffe dass ich euch das Service Locator Pattern näher bringen konnte.

Mit freundlichen Grüßen
Nathalie