[Design Patterns] Service Locator

Service Locator được sử dụng khi chúng ta muốn định vị các object xử lý yêu cầu service khác nhau bằng việc sử dụng trình tìm kiếm JNDI. Hãy lấy ví dụ về một tác vụ tìm kiếm JNDI cho một service tiêu tốn nhiều tài nguyên xử lý của hệ thống và cả thời

Service Locator được sử dụng khi chúng ta muốn định vị các object xử lý yêu cầu service khác nhau bằng việc sử dụng trình tìm kiếm JNDI. Hãy lấy ví dụ về một tác vụ tìm kiếm JNDI cho một service tiêu tốn nhiều tài nguyên xử lý của hệ thống và cả thời gian thực hiện, Service Locator xuất hiện ở đây và tận dụng kĩ thuật ghi nhớ đệm caching để giúp chúng ta hoàn thành công việc. Lần đầu tiên khi 1 service được yêu cầu, Service Locator sẽ tìm kiếm trong JNDI và ghi đệm object được tìm thấy và sử dụng. Những lần yêu cầu sau tới service này được thực hiện qua cache của Service Locator giúp cải thiện hiệu năng xử lý của hệ thống. Sau đây là các thành phần có mặt trong pattern:

  • Service – interface chung cho các class tạo object xử lý yêu cầu.
  • Context – JNDI tập trung tất cả tham chiếu tới các service.
  • Service Locator – gửi yêu cầu tìm kiếm service tới JNDI và ghi đệm các service đã được sử dụng.
  • Cache – bộ nhớ đệm lưu trữ các tham chiếu tới các service đã được sử dụng.
  • Client – object gửi yêu cầu tới Service Locator.

Áp dụng triển khai

Chúng ta sẽ tạo ra interface Service và các class triển khai, sau đó là các class Context, Cache, ServiceLocator. Code client gửi yêu cầu sẽ được viết mô phỏng tại main của PatternDemo.

Bước 1

Tạo interface Service và các class triển khai.

servicelocator/Service.java

packageservicelocator;publicinterfaceService{StringgetName();voidprocess();}

Các class triển khai Service.

servicelocator/OneService.java

packageservicelocator;classOneServiceimplementsService{@OverridepublicStringgetName(){return"One Service";}@Overridepublicvoidprocess(){System.out.println("Processing One Service...");}}// class

servicelocator/AnotherService.java

packageservicelocator;classAnotherServiceimplementsService{@OverridepublicStringgetName(){return"Another Service";}@Overridepublicvoidprocess(){System.out.println("Processing Another Service...");}}// class

Bước 2

Tạo Context để tìm kiếm JDNI.

servicelocator/Context.java

packageservicelocator;classContext{publicServicelookup(String jndiName){if("one service".equalsIgnoreCase(jndiName))returnnewOneService();if("another service".equalsIgnoreCase(jndiName))returnnewAnotherService();elsereturnnull;}}

Bước 3

Tạo Cache ghi đệm các service.

servicelocator/Cache.java

packageservicelocator;importjava.util.ArrayList;importjava.util.List;classCache{privateList<Service> serviceList =newArrayList<Service>();publicServicegetService(String jndiName){List<Service> matched = serviceList
         .stream().filter((service)-> service.getName().equalsIgnoreCase(jndiName)).toList();if(matched.isEmpty())returnnull;elsereturn serviceList.get(0);}publicvoidaddService(Service jndi){if(getService(jndi.getName())!=null){/* do nothing */}else
         serviceList.add(jndi);}}// class

Bước 4

Tạo ServiceLocator.

servicelocator/ServiceLocator.java

packageservicelocator;publicclassServiceLocator{privatestaticCache cache =newCache();publicstaticServicegetService(String jndiName){Service service = cache.getService(jndiName);if(service !=null)returnlog(service);elsereturnrequestService(jndiName);}privatestaticServicerequestService(String jndiName){Context context =newContext();Service service = context.lookup(jndiName);
      cache.addService(service);return service;}privatestaticServicelog(Service service){System.out.println("Found cached service: "+ service.getName());return service;}}

Bước 5

Viết code main để thử hoạt động của pattern.

PatternDemo.java

importservicelocator.Service;importservicelocator.ServiceLocator;publicclassPatternDemo{publicstaticvoidmain(String[] args){Service service;/* Request new services */System.out.println("===============");
      service =ServiceLocator.getService("one service");
      service.process();
      service =ServiceLocator.getService("another service");
      service.process();/* Request cached services */System.out.println("===============");
      service =ServiceLocator.getService("one service");
      service.process();
      service =ServiceLocator.getService("another service");
      service.process();}}

Bước 6

Kiểm chứng lại kết quả được in ra ở console.

console

===============ProcessingOneService...ProcessingAnotherService...===============Found cached service:OneServiceProcessingOneService...Found cached service:OneServiceProcessingOneService...

Nguồn: viblo.asia

Bài viết liên quan

9 Mẹo lập trình Web “ẩn mình” giúp tiết kiệm hàng giờ đồng hồ

Hầu hết các lập trình viên (kể cả những người giỏi) đều tốn thời gian x

Can GPT-4o Generate Images? All You Need to Know about GPT-4o-image

OpenAI‘s GPT-4o, introduced on March 25, 2025, has revolutionized the way we create visual con

Khi nào nên dùng main, section, article, header, footer, và aside trong HTML5

HTML5 đã giới thiệu các thẻ ngữ nghĩa giúp cấu trúc nội dung web một cách có

So sánh Webhook và API: Khi nào nên sử dụng?

Trong lĩnh vực công nghệ thông tin và phát triển phần mềm, Webhook và API là hai th