java定位功能_java单例模式应用场景

java定位功能_java单例模式应用场景Service1.javapublic class Service1 implements Service { public void exe

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

· 服务(Service) – 实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到。

· Context / 初始的 Context – JNDI Context 带有对要查找的服务的引用。

· 服务定位器(Service Locator) – 服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触。

· 缓存(Cache) – 缓存存储服务的引用,以便复用它们。

· 客户端(Client) – Client 是通过 ServiceLocator 调用服务的对象。

实现

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

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

java定位功能_java单例模式应用场景

步骤 1

创建服务接口 Service。

Service.java

public interface Service {

public String getName(); public void execute();

}

步骤 2

创建实体服务。

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”;

}

}

步骤 3

为 JNDI 查询创建 InitialContext。

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;

}

}

步骤 4

创建缓存 Cache。

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);

}

}

}

步骤 5

创建服务定位器。

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;

}

}

步骤 6

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

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();

}

}

步骤 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://daima100.com/12019.html

(0)

相关推荐

  • Vue页面骨架屏_vue横竖屏怎么切换

    Vue页面骨架屏_vue横竖屏怎么切换在开发webapp的时候总是会受到首屏加载时间过长的影响,主流的解决方法是在载入完成之前显示loading图效果,而一些大公司会配置一套服务端渲染的架构来解决这个问题。考虑到ssr所要解决的一系列问题,越来越多的APP采用了“骨架屏”的方式去提升用户体验。

    2023-08-04
    122
  • SqlServer 2016服务器配置远程访问[亲测有效]

    SqlServer 2016服务器配置远程访问[亲测有效]
    最近在新的服务上安装了SqlServer 2016,但安装完成后本地连接没有问题,使用其他其他主机进行远程连接时,无法连接。那么则需要配置一下SqlServ…

    2023-04-07
    153
  • 【从0安装】安装nodejs[通俗易懂]

    【从0安装】安装nodejs[通俗易懂]1,下载nodejs http://nodejs.cn/download/ 注意下载版本,可能与win7 不能使用。 2,安装,直接点击下一步。 3,查看安装nodejs版本 node -v

    2023-03-08
    148
  • 自动化测试用例如何编写[通俗易懂]

    自动化测试用例如何编写[通俗易懂]自动化测试脚本 什么是自动化测试? 自动化测试是验证和验证软件是否满足所有用户需求,并使用自动化工具按预期运行。它检查在产品开发阶段期间和之后出现的错误、问题和其他类型的缺陷。这种类型的软件测试运行在

    2023-07-16
    128
  • 分享信息安全工作小记录怎么写_如何加强信息安全

    分享信息安全工作小记录怎么写_如何加强信息安全0x01工作背景:1、某厅级部门政府站点被篡改2、上级主管部门安全通告3、配合该部门查明原因限期整改0x02工作记录:1、信息收集A、首先到机房了解了一下拓扑图,大概就是:互联网-防火墙-web应用防

    2023-07-22
    134
  • PyCharm快捷键注释大全

    PyCharm快捷键注释大全PyCharm是专门为Python开发者打造的一款代码编辑器。除了提供各种常规的代码编辑功能外,PyCharm还提供了丰富的快捷键功能。其中,注释功能是Python开发常用的功能之一,也是PyCharm编辑器中的重要功能之一。那么,本文将详细介绍PyCharm的快捷键注释功能,方便Python开发人员更加高效地进行开发。

    2024-05-29
    61
  • python列表课后题错误(关于python的列表,以下选项中描述错误)

    python列表课后题错误(关于python的列表,以下选项中描述错误)要把代码发现来才知道,以下是常见的错误

    2023-11-22
    160
  • DIGIX数字生活节活动很精彩值得参加「终于解决」

    DIGIX数字生活节活动很精彩值得参加「终于解决」参加了西安站的DIGIX数字生活节,体验了诗词互动专区,获得上半句唐诗后,仅需答出下半句与华为终端云服务产品相关的诗句,就能获得体验卡。还有畅玩空间体验区,带上VR设备化身游戏玩家,有种置身于游戏场…

    2023-02-26
    152

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注