Mẫu thiết kế - Mẫu định vị dịch vụ
Mẫu thiết kế bộ định vị dịch vụ được sử dụng khi chúng ta muốn định vị các dịch vụ khác nhau bằng cách sử dụng tra cứu JNDI. Xem xét chi phí tra cứu JNDI cho một dịch vụ cao, mẫu Service Locator sử dụng kỹ thuật bộ nhớ đệm. Lần đầu tiên một dịch vụ được yêu cầu, Service Locator sẽ tìm kiếm trong JNDI và lưu vào bộ nhớ cache đối tượng dịch vụ. Việc tra cứu thêm hoặc cùng một dịch vụ thông qua Service Locator được thực hiện trong bộ nhớ cache của nó, giúp cải thiện hiệu suất của ứng dụng ở mức độ lớn. Sau đây là các thực thể của kiểu thiết kế này.
Service- Dịch vụ thực tế sẽ xử lý yêu cầu. Tham chiếu của dịch vụ như vậy sẽ được xem xét trong máy chủ JNDI.
Context / Initial Context - JNDI Context mang tham chiếu đến dịch vụ được sử dụng cho mục đích tra cứu.
Service Locator - Service Locator là một điểm liên hệ duy nhất để nhận các dịch vụ bằng cách tra cứu JNDI vào bộ nhớ đệm các dịch vụ.
Cache - Bộ nhớ đệm để lưu trữ các tham chiếu của các dịch vụ để sử dụng lại chúng
Client - Máy khách là đối tượng gọi ra các dịch vụ thông qua ServiceLocator.
Thực hiện
Chúng ta sẽ tạo ServiceLocator , InitialContext , Cache , Service như các đối tượng khác nhau đại diện cho các thực thể của chúng ta. Service1 và Service2 đại diện cho các dịch vụ cụ thể.
ServiceLocatorPatternDemo , lớp demo của chúng tôi, đang hoạt động như một ứng dụng khách ở đây và sẽ sử dụng ServiceLocator để chứng minh Mẫu thiết kế Service Locator.
Bước 1
Tạo giao diện Dịch vụ.
Service.java
public interface Service {
public String getName();
public void execute();
}
Bước 2
Tạo ra các dịch vụ cụ thể.
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";
}
}
Bước 3
Tạo InitialContext để tra cứu JNDI
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;
}
}
Bước 4
Tạo bộ nhớ đệm
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);
}
}
}
Bước 5
Tạo bộ định vị dịch vụ
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;
}
}
Bước 6
Sử dụng ServiceLocator để chứng minh Mẫu thiết kế Service Locator.
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();
}
}
Bước 7
Xác minh kết quả đầu ra.
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