Service Locator Pattern là gì?
Service Locator là một design pattern thông dụng cho phép tách rời (decouple) một class với các dependency (hay được gọi là service) của nó. Service Locator có thể coi là một đối tượng trung gian trong việc liên kết class và các dependency.
Cài đặt Service Locator Pattern
Implement một DI pattern một cách cơ bản nhất. Với pattern này thì mình sẽ có 3 phần:
- Client class (hoặc là Consumer class): còn được gọi là lớp bị phụ thuộc (dependant class). Lớp này sẽ phụ thuộc (sử dụng) một dịch vụ (service) nào đó để thực hiện một việc có chủ đích.
- Service class : lớp phụ thuộc (dependency). Lớp cung cấp một dịch vụ.
- Injector class: lớp làm nhiệm vụ “tiêm” (inject) dependency vào dependant class.
Về bản chất Client class và Service Class đều là các Serive, và bài toán của chúng ta khác biệt ở việc chúng ta xử lý Injector thế nào
Các thành phần tham gia Service Locator Pattern:
- Service : các Service thực tế sẽ xử lý các request từ Client. Đối tượng Service ban đầu được tìm bởi ServiceLocator và trả lại kết quả theo yêu cầu.
- Service Locator : là một điểm liên lạc duy nhất để trả về các Service từ bộ đệm (Cache).
- Cache : một đối tượng để lưu trữ các tham chiếu đến Service để sử dụng lại chúng sau này.
- Initial Context : tạo và đăng ký tham chiếu đến các Service trong bộ đệm (Cache).
- Client : là đối tượng gọi các Service thông qua ServiceLocator.
1. Service (Dịch vụ thực tế)
// Interface chung cho các Service
public interface Service {
void execute();
}
// Một dịch vụ cụ thể: EmailService
public class EmailService implements Service {
@Override
public void execute() {
System.out.println("Executing Email Service");
}
}
// Một dịch vụ cụ thể khác: LoggingService
public class LoggingService implements Service {
@Override
public void execute() {
System.out.println("Executing Logging Service");
}
}
2. Cache (Bộ đệm)
import java.util.HashMap;
import java.util.Map;
// Cache chứa các dịch vụ đã được tạo
public class Cache {
private Map<String, Service> serviceCache = new HashMap<>();
public void addService(String serviceName, Service service) {
serviceCache.put(serviceName, service);
}
public Service getService(String serviceName) {
return serviceCache.get(serviceName);
}
public boolean containsService(String serviceName) {
return serviceCache.containsKey(serviceName);
}
}
3. Service Locator (Trung gian tìm dịch vụ)
// Service Locator tìm dịch vụ từ Cache
public class ServiceLocator {
private Cache cache = new Cache(); // Bộ đệm để lưu trữ các dịch vụ
// Tìm dịch vụ từ cache hoặc khởi tạo mới nếu chưa có
public Service getService(String serviceName) {
if (cache.containsService(serviceName)) {
return cache.getService(serviceName); // Trả về dịch vụ từ bộ đệm
} else {
// Tạo mới dịch vụ nếu chưa có
Service service = createService(serviceName);
cache.addService(serviceName, service);
return service;
}
}
// Phương thức khởi tạo dịch vụ mới
private Service createService(String serviceName) {
if (serviceName.equalsIgnoreCase("EmailService")) {
return new EmailService();
} else if (serviceName.equalsIgnoreCase("LoggingService")) {
return new LoggingService();
}
return null;
}
}
4. Initial Context (Bối cảnh ban đầu)
Bối cảnh ban đầu là nơi đăng ký và khởi tạo các dịch vụ. Đây là điểm bắt đầu của hệ thống.
// Context khởi tạo và đăng ký các dịch vụ
public class InitialContext {
public static void initializeServices(ServiceLocator serviceLocator) {
// Đăng ký dịch vụ vào bộ đệm thông qua ServiceLocator
serviceLocator.getService("EmailService"); // Tự động tạo dịch vụ EmailService
serviceLocator.getService("LoggingService"); // Tự động tạo dịch vụ LoggingService
}
}
5. Client (Khách hàng gọi dịch vụ)
// Client sử dụng ServiceLocator để yêu cầu dịch vụ
public class Client {
public static void main(String[] args) {
ServiceLocator serviceLocator = new ServiceLocator(); // Tạo một ServiceLocator
// Khởi tạo các dịch vụ trong hệ thống
InitialContext.initializeServices(serviceLocator);
// Client yêu cầu dịch vụ và sử dụng
Service emailService = serviceLocator.getService("EmailService");
emailService.execute(); // Thực thi dịch vụ EmailService
Service loggingService = serviceLocator.getService("LoggingService");
loggingService.execute(); // Thực thi dịch vụ LoggingService
}
}
Tham khảo
https://viblo.asia/p/tim-hieu-ve-dependency-injection-va-service-locator-gAm5yDk8ldb