[Design Pattern] Service Locator Pattern 简单案例
Service Locator Pattern,即服务定位模式,用于定位不同的服务。考虑到 InitialContext::lookup 的成本比较高,提供了 Cache 类缓存以定位到的服务。

代码实现
Service 接口
public interface Service {
public String getName();
public void execute();
}
Service1, Service2 实现 Service 接口,提供具体服务
public class Service1 implements Service {
private String name = "service1";
@Override
public String getName() {
return name;
}
@Override
public void execute() {
System.out.println(name + "executing");
}
}
public class Service2 implements Service {
private String name = "service2";
@Override
public String getName() {
return name;
}
@Override
public void execute() {
System.out.println(name + " executing");
}
}
InitialContext 用于查找并初始化服务
public class InitialContext {
public static Service lookup(String jndiName){
System.out.println(" initializing " + jndiName);
if (jndiName.equals("service1")){
return new Service1();
}
else if(jndiName.equals("service2")){
return new Service2();
}
else{
System.out.println("cannot find " + jndiName);
}
return null;
}
}
ServiceLocator 是在 InitialConext 之前的一个层,把已找到的服务缓存起来,避免重复创建服务。
public class ServiceLocator {
private static Cache cache = new Cache();
public static Service getService(String serviceName){
Service service = cache.getService(serviceName);
if (service == null){
service = InitialContext.lookup(serviceName);
cache.addService(service);
}
return service;
}
}
演示服务定位模式。
public class ServiceLocatorPatternDemo {
public static void main() {
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();
}
}
注:
为了简化模式关系演示,本案例没有处理找不到服务的情况,可以在 InitialContext::lookup 和 ServiceLocator::getService 方法声明爆出异常,交由客户端代码处理服务无法找到的情况。
参考资料
Design Pattern - Service Locator Pattern, TutorialsPoint
[Design Pattern] Service Locator Pattern 简单案例的更多相关文章
- Service Locator Pattern 服务定位
https://www.geeksforgeeks.org/service-locator-pattern/ Service Locator Pattern Last Updated: 06-03-2 ...
- Design Pattern - Service Locator Pattern--转载
原文地址:http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm The service locator de ...
- .NET 服务器定位模式(Service Locator Pattern)——Common Service Locator
本文内容 场景 目标 解决方案 实现细节 思考 相关模式 更多信息 参考资料 Common Service Locator 代码很简单,它一般不会单独使用,而是作为一个单件模式,与像 .net Uni ...
- 《Prism 5.0源码走读》Service Locator Pattern
在Prism Bootstrapper里面取实例的时候使用 ServiceLocator模式,使用的是CommonServiceLocator库 (http://commonservicelocato ...
- [Architecture Pattern] Singleton Locator
[Architecture Pattern] Singleton Locator 目的 组件自己提供Service Locator模式,用来降低组件的耦合度. 情景 在开发系统时,底层的Infrast ...
- Service Locator 模式
什么是Service Locator 模式? 服务定位模式(Service Locator Pattern)是一种软件开发中的设计模式,通过应用强大的抽象层,可对涉及尝试获取一个服务的过程进行封装.该 ...
- 【转】Understanding Inversion of Control, Dependency Injection and Service Locator Print
原文:https://www.dotnettricks.com/learn/dependencyinjection/understanding-inversion-of-control-depende ...
- Atitit。如何实现dip, di ,ioc ,Service Locator的区别于联系
Atitit.如何实现dip, di ,ioc ,Service Locator的区别于联系 1. Dip原则又来自于松耦合思想方向1 2. 要实现dip原则,有以下俩个模式1 3. Ioc和di的 ...
- [Design Pattern] Front Controller Pattern 简单案例
Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...
随机推荐
- Android中的Surface和SurfaceView
一.什么是Surface 简单的说Surface对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都要画在Surface的Canvas上(后面有原因解释).传统的view共享一 ...
- 【开源java游戏框架libgdx专题】-02-Eclipse Gradle 环境安装
创建eclipse开发环境 Eclipse 4.5 Help -> install newsoftware 填上下载地址(Eclipse 4.5及以上版本): http://dist.sprin ...
- HTML (1)href与Action,get post
1. href与Action的区别 href只能get参数,action能get参数又能post参数 href一般用于单个连接,可以带参数(URL重写),是采用get方式请求的,在地址栏中可以看到 ...
- iOS开发中的常用宏定义
在iOS开发的过程中合理的使用宏定义能够极大提高编码的速度,下面是一些常用的宏定义,部分内容来自互联网 Log // 调试状态, 打开LOG功能 #ifdef DEBUG #define GLLog( ...
- Linux服务器指令
1.查看cpu信息:/proc/cpuinfo2.查看内存信息:/prco/meminfo3.查看服务器版本信息:cat /etc/issue4.服务器系统位数:uname -a5.网卡信息:ifco ...
- WebService笔记-Schema约束
Schema约束 俗话说得好 好记性不如烂笔头. 看了下WebService视频,觉得还是得下笔记. 观看的视频地址:http://edu.51cto.com/ ...
- Spring+SpringMVC+Mybatis+MAVEN+Eclipse+项目完整环境搭建
1.新建一个Maven项目,创建父项目. 2.创建子项目模块 3.创建javaWeb项目 4.创建后的项目目录结构 5.Maven文件配置 parent父项目pom.xml文件配置 <?xml ...
- 浅谈intval()函数用法
<? } } 总结:intval()函数功能1.参数一定是数字否则会报错,2.如果是数字那一定是整数,如果有小点,那会省略掉,3,强调参数可以有“-”值.4.参数第一位不应为0开头,不然会自动转 ...
- php防止sql注入函数
$magic_quotes_gpc = get_magic_quotes_gpc(); @extract(daddslashes($_COOKIE)); @extract(daddslashes($_ ...
- POJ3617 简单字符串
三分之一的通过率的字符串 题意为,输入一个S串,有一个空串T.对S串有两种操作,一是取出S串的头放入T串的尾,二是取出S串的尾放入T串的尾.要求是要使得T串的字典序最小. 从题意来看是一个很明显的贪心 ...