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)

相关推荐

  • MySQL学习笔记(21):优化磁盘IO

    MySQL学习笔记(21):优化磁盘IO本文更新于2020-04-05,使用MySQL 5.7,操作系统为Deepin 15.4。 使用符号连接分布IO 利用操作系统的符号连接,将不同的数据库、表、索引指向不同的物理磁盘,从而达到分布磁盘I

    2023-03-24
    148
  • BOE(京东方)2020年报发布:营收1355.53亿元  净利润大幅增长162.46%「建议收藏」

    BOE(京东方)2020年报发布:营收1355.53亿元  净利润大幅增长162.46%「建议收藏」4月12日晚,京东方科技集团股份有限公司(京东方A:000725;京东方B:200725)发布2020年年度报告,全年实现营业收入1355.53亿元,同比增长16.80%;归属于上市公司股东的净利润…

    2023-04-10
    151
  • 以pycharm设置断点为中心写1个标题

    以pycharm设置断点为中心写1个标题编写代码并进行调试是编程工程师日常工作中的重要内容之一。PyCharm是一款功能强大、使用广泛的Python IDE开发环境。设置断点可以帮助工程师更加高效地进行调试,这也是PyCharm的一个强大功能。

    2024-08-20
    20
  • 一次线上MySQL死锁告警原因排查[亲测有效]

    一次线上MySQL死锁告警原因排查[亲测有效]项目场景:一次线上MySQL死锁告警原因排查 最近处理了一次线上数据告警,记录一下。 问题描述 同步书架书籍的接口频繁抛出异常,提示数据库出现死锁,异常如下: 本日异常次数:2,异常日志:java.l

    2023-05-11
    137
  • 文献搜索算法[亲测有效]

    文献搜索算法[亲测有效]搜索算法是利用计算机的强大计算能力来有目的的穷举一个问题的解空间的部分或所有的可能情况,从而求出问题的解的一种方法。在具体的实现中往往是一段计算机代码,用来在大型的数据库中查找具有特定属性的项目。 …

    2023-01-31
    137
  • Python Tuples: 简洁高效的多元素数据结构

    Python Tuples: 简洁高效的多元素数据结构Python中的元组(Tuples)是一个有序的多元素集合,可以存储不同类型的数据。与列表相比,元组是一个不可变对象,即一旦创建就不能修改内容。元组被广泛应用于函数返回多个值或者在字典作为键使用的情况等。下面我们将通过如何创建、访问、修改以及结合其他对象使用等多个方面对Python元组进行详细讲解。

    2024-03-16
    68
  • Pycharm多行缩进

    Pycharm多行缩进在进行Python编程时,代码的缩进是非常重要的,它可以决定程序是否正常运行,而Pycharm是当今最受欢迎的Python集成开发环境之一,这里将详细介绍在Pycharm中如何进行多行缩进。

    2024-04-17
    66
  • Mysql优化一[通俗易懂]

    Mysql优化一[通俗易懂]Mysql优化 一、存储引擎 1.查看所有引擎 2.查看默认存储引擎 3.MyISAM和InnoDB | 对比项 | MyISAM | InnoDB | | : : | : : | : : | | 主

    2022-12-16
    153

发表回复

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