服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种设计模式的实体。

  • 服务(Service) - 实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到。
  • Context / 初始的 Context - JNDI Context 带有对要查找的服务的引用。
  • 服务定位器(Service Locator) - 服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触。
  • 缓存(Cache) - 缓存存储服务的引用,以便复用它们。
  • 客户端(Client) - Client 是通过 ServiceLocator 调用服务的对象。

实现

我们将创建 ServiceLocatorInitialContextCacheService 作为表示实体的各种对象。Service1 和 Service2 表示实体服务。

ServiceLocatorPatternDemo,我们的演示类在这里是作为一个客户端,将使用 ServiceLocator 来演示服务定位器设计模式。

步骤 1

创建服务接口 Service。

Service.java

package gof.servicelocatorpattern;public interface Service {String getName();void execute();
}

步骤 2

创建实体服务。

Service1.java

package gof.servicelocatorpattern;public class Service1 implements Service{@Overridepublic String getName() {return "Service1";}@Overridepublic void execute() {System.out.println("Executing Service1");}}

Service2.java

package gof.servicelocatorpattern;public class Service2 implements Service{@Overridepublic String getName() {return "Service2";}@Overridepublic void execute() {System.out.println("Executing Service2");}}

步骤 3

为 JNDI 查询创建 InitialContext。

InitialContext.java

package gof.servicelocatorpattern;public class InitialContext {public Object lookup(String jndiName){if("SERVICE1".equalsIgnoreCase(jndiName)){System.out.println("Looking up and Creating a new Service1 object");return new Service1();}else if("SERVICE2".equalsIgnoreCase(jndiName)){System.out.println("Looking up and Creating a new Service2 object");return new Service2();}return null;}
}

步骤 4

创建缓存 Cache。

Cache.java

package gof.servicelocatorpattern;import java.util.ArrayList;
import java.util.List;public class Cache {private List<Service> services;public Cache() {super();services = new ArrayList<Service>();}public Service getServices(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 service){boolean exists = false;for(Service ser : services){if(ser.getName().equalsIgnoreCase(service.getName())){exists = true;}}if(!exists){services.add(service);}}
}

步骤 5

创建服务定位器。

ServiceLocator.java

package gof.servicelocatorpattern;public class ServiceLocator {private static Cache cache;static {cache = new Cache();}public static Service getService(String jndiName){Service service = cache.getServices(jndiName);if(null != service){return service;}InitialContext context = new InitialContext();service = (Service) context.lookup(jndiName);cache.addService(service);return service;}
}

步骤 6

使用 ServiceLocator 来演示服务定位器设计模式。

ServiceLocatorPatternDemo.java

package gof.servicelocatorpattern;public class ServiceLocatorPatternDemo {public static void main(String[] args) {Service service = null;service = ServiceLocator.getService("Service1");service.execute();service = ServiceLocator.getService("Service2");service.execute();service = ServiceLocator.getService("Service1");service.execute();service = ServiceLocator.getService("Service2");service.execute();}
}

步骤 7

验证输出。

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

啦啦啦

转载于:https://www.cnblogs.com/ClassNotFoundException/p/6658573.html

GoF--服务定位器模式相关推荐

  1. 三十六、服务定位器模式 (Service Locator Pattern)

    服务定位器模式(Service Locator Pattern)用于想使用 JNDI 查询定位各种服务的时候 考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术 在首次请求某 ...

  2. Java服务定位器模式

    服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候.考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术.在首次请 ...

  3. php service locator,服务定位器模式(Service Locator)

    服务定位器模式(Service Locator) 服务定位器模式被一些人认为是一种反面模式.它违反了依赖倒置原则.该模式隐藏类的依赖,而不是暴露依赖(如果暴露可通过依赖注入的方式注入依赖).当某项服务 ...

  4. 避免在ASP.NET Core中使用服务定位器模式

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:服务定位器(Service Locator)作为一种反模式,一般情况下应该避免使用,在 ...

  5. 设计模式简介及GoF 23种模式的分类(两种分类方式)

    一.设计模式(Design Patterns)简介: 设计模式代表了最佳实践,通常被有经验的面向对象的开发人员使用. 设计模式是程序猿在软件开发过程中面临的一般问题的解决方案. 设计模式是一套反复使用 ...

  6. J2EE业务层模式:服务门面,应用服务,以及业务委托,服务定位器

    现在J2EE领域无论是表现层,业务层还是持久层,框架满天飞,虽然说框架为我们省了很大的力气,但是我们还是需要掌握J2EE里面经常用到的一些模式,下面对J2EE领域业务层的几个模式做一个小的总结: 服务 ...

  7. 基于ACE的服务定位器(图失效)

    军械工程学院本科毕业论文 基于ACE的服务定位器 2006届计算机工程专业 指导教员:张剑炜 学员姓名:庄泽南 军械工程学院 二零零六年六月 论 文 摘 要 ACE自适配通信环境(ADAPTIVE C ...

  8. 服务定位器 - Caliburn.Micro 文档系列

    文章目录 服务定位器 (Service Locator) 入门 为 IoC 注入功能 在你的应用中使用 IOC 获取单一服务 获得一系列服务 注入实例 服务定位器 (Service Locator) ...

  9. Service Locator服务定位器

    先讲服务定位器, 有些摘录于 http://www.digpage.com/convention.html Service Locator目的也在于解耦他的模式非常贴合Web这种基于服务和组件的应用的 ...

最新文章

  1. java string改变的影响_为什么Java的string类要设成immutable(不可变的)
  2. centos7 firewalld日常使用
  3. python递归合并排序_python 归并排序的递归法与迭代法(利用队列)实现,以及性能测试...
  4. ios 状态蓝颜色控制
  5. 3D特效师可以下班了丨Science
  6. docker删除镜像命令_第三章 Docker常用命令之镜像命令
  7. Problem 77:Prime summations
  8. linux AIO (异步IO) 那点事儿
  9. 简单java题_java
  10. mysql经常问到的面试题_20道BAT面试官最喜欢问的JVM+MySQL面试题(含答案解析)...
  11. php默认语法,php语法基本规则
  12. 1.Thinkphp入门--框架介绍
  13. CVPR 2022数据集汇总|包含目标检测、多模态等方向
  14. 物联网中对视频远程传输解决方案
  15. thinkphp5 TP5 两表关联查询
  16. VMware安装Linux教程
  17. 「SDUDOC」个人总结报告
  18. 2977:生理周期(枚举)
  19. Sil7172中文资料
  20. 亚马逊AWS:一个字头的诞生

热门文章

  1. mysql查询全年星期_数据库查询显示一年中所有的周一到周五的数据
  2. c语言随机抽取小程序_C语言整人小程序,慎用,谨记!
  3. jar java classpath_Java ClassLoader和ClassPath
  4. VC连接SQLite3的方法 MFC封装类
  5. h0152. 故事计算题(计蒜客——西邮K题)解析
  6. python牛顿迭代法_Jacobi迭代算法的Python实现详解
  7. selenium+linux+python,Linux下Python+selenium自动化环境搭建
  8. flink sql 部署_在FlinkSQL中使用SQL client时,如何使用 query配置?
  9. cesium坡度坡向分析_综合分析地理空间,科学规划乡村区域
  10. 音乐上传网站_国外最受欢迎的15个BT下载网站