Entwurfsmuster - Service Locator-Muster
Das Service Locator-Entwurfsmuster wird verwendet, wenn verschiedene Services mithilfe der JNDI-Suche gesucht werden sollen. Angesichts der hohen Kosten für die Suche nach JNDI für einen Dienst verwendet das Service Locator-Muster die Caching-Technik. Wenn zum ersten Mal ein Dienst erforderlich ist, sucht Service Locator in JNDI und speichert das Dienstobjekt zwischen. Eine weitere Suche oder derselbe Dienst über Service Locator erfolgt in seinem Cache, wodurch die Leistung der Anwendung erheblich verbessert wird. Im Folgenden sind die Entitäten dieser Art von Entwurfsmuster aufgeführt.
Service- Tatsächlicher Service, der die Anfrage bearbeitet. Die Referenz eines solchen Dienstes ist auf dem JNDI-Server zu sehen.
Context / Initial Context - Der JNDI-Kontext enthält den Verweis auf den Dienst, der für Suchzwecke verwendet wird.
Service Locator - Service Locator ist eine zentrale Anlaufstelle, um Dienste per JNDI-Lookup abzurufen, die die Dienste zwischenspeichern.
Cache - Cache zum Speichern von Referenzen von Diensten, um sie wiederzuverwenden
Client - Client ist das Objekt, das die Dienste über ServiceLocator aufruft.
Implementierung
Wir werden einen ServiceLocator , InitialContext , Cache , Service als verschiedene Objekte erstellen , die unsere Entitäten darstellen. Service1 und Service2 stehen für konkrete Services.
ServiceLocatorPatternDemo , unsere Demo-Klasse, fungiert hier als Client und verwendet ServiceLocator , um das Service Locator-Entwurfsmuster zu demonstrieren.
Schritt 1
Serviceschnittstelle erstellen.
Service.java
public interface Service {
public String getName();
public void execute();
}
Schritt 2
Erstellen Sie konkrete Dienstleistungen.
Service1.java
public class Service1 implements Service {
public void execute(){
System.out.println("Executing Service1");
}
@Override
public String getName() {
return "Service1";
}
}
Service2.java
public class Service2 implements Service {
public void execute(){
System.out.println("Executing Service2");
}
@Override
public String getName() {
return "Service2";
}
}
Schritt 3
Erstellen Sie InitialContext für die JNDI-Suche
InitialContext.java
public class InitialContext {
public Object lookup(String jndiName){
if(jndiName.equalsIgnoreCase("SERVICE1")){
System.out.println("Looking up and creating a new Service1 object");
return new Service1();
}
else if (jndiName.equalsIgnoreCase("SERVICE2")){
System.out.println("Looking up and creating a new Service2 object");
return new Service2();
}
return null;
}
}
Schritt 4
Cache erstellen
Cache.java
import java.util.ArrayList;
import java.util.List;
public class Cache {
private List<Service> services;
public Cache(){
services = new ArrayList<Service>();
}
public Service getService(String serviceName){
for (Service service : services) {
if(service.getName().equalsIgnoreCase(serviceName)){
System.out.println("Returning cached " + serviceName + " object");
return service;
}
}
return null;
}
public void addService(Service newService){
boolean exists = false;
for (Service service : services) {
if(service.getName().equalsIgnoreCase(newService.getName())){
exists = true;
}
}
if(!exists){
services.add(newService);
}
}
}
Schritt 5
Service Locator erstellen
ServiceLocator.java
public class ServiceLocator {
private static Cache cache;
static {
cache = new Cache();
}
public static Service getService(String jndiName){
Service service = cache.getService(jndiName);
if(service != null){
return service;
}
InitialContext context = new InitialContext();
Service service1 = (Service)context.lookup(jndiName);
cache.addService(service1);
return service1;
}
}
Schritt 6
Verwenden Sie den ServiceLocator , um das Entwurfsmuster des Service Locator zu demonstrieren.
ServiceLocatorPatternDemo.java
public class ServiceLocatorPatternDemo {
public static void main(String[] args) {
Service service = ServiceLocator.getService("Service1");
service.execute();
service = ServiceLocator.getService("Service2");
service.execute();
service = ServiceLocator.getService("Service1");
service.execute();
service = ServiceLocator.getService("Service2");
service.execute();
}
}
Schritt 7
Überprüfen Sie die Ausgabe.
Looking up and creating a new Service1 object
Executing Service1
Looking up and creating a new Service2 object
Executing Service2
Returning cached Service1 object
Executing Service1
Returning cached Service2 object
Executing Service2