内容简介:服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种设计模式的实体。
服务定位器模式(Service Locator Pattern)用在我们想使用 JNDI 查询定位各种服务的时候。考虑到为某个服务查找 JNDI 的代价很高,服务定位器模式充分利用了缓存技术。在首次请求某个服务时,服务定位器在 JNDI 中查找服务,并缓存该服务对象。当再次请求相同的服务时,服务定位器会在它的缓存中查找,这样可以在很大程度上提高应用程序的性能。以下是这种 设计模式 的实体。
- 服务(Service) - 实际处理请求的服务。对这种服务的引用可以在 JNDI 服务器中查找到。
- Context / 初始的 Context - JNDI Context 带有对要查找的服务的引用。
- 服务定位器(Service Locator) - 服务定位器是通过 JNDI 查找和缓存服务来获取服务的单点接触。
- 缓存(Cache) - 缓存存储服务的引用,以便复用它们。
- 客户端(Client) - Client 是通过 ServiceLocator 调用服务的对象。
package main import "fmt" type Service interface { GetName() string Execute() } type Service1 struct{} func (s *Service1) Execute() { fmt.Println("Executing service1") } func (s *Service1) GetName() string { return "Service1" } type Service2 struct{} func (s *Service2) Execute() { fmt.Println("Executing service2") } func (s *Service2) GetName() string { return "Service2" } type InitContext struct{} func (i *InitContext) Lookup(jndiName string) Service { if jndiName == "service1" { fmt.Println("looking up and creating a new service1 object") return &Service1{} } if jndiName == "service2" { fmt.Println("looking up and creating a new service2 object") return &Service2{} } return nil } type Cache struct { Services map[string]Service } func NewCache() *Cache { return &Cache{ Services: map[string]Service{}, } } func (c *Cache) GetService(serviceName string) Service { if v, ok := c.Services[serviceName]; ok { fmt.Println("return cached service: ", serviceName) return v } return nil } func (c *Cache) AddService(name string, service Service) { c.Services[name] = service } type ServiceLocator struct { Cache *Cache } func NewServiceLocator() *ServiceLocator { return &ServiceLocator{ Cache: NewCache(), } } func (s *ServiceLocator) GetService(jndiName string) Service { service := s.Cache.GetService(jndiName) if service != nil { return service } // create a new service1 context := &InitContext{} service = context.Lookup(jndiName) s.Cache.AddService(jndiName, service) return service } func main() { locator := NewServiceLocator() service := locator.GetService("service1") service.Execute() service = locator.GetService("service2") service.Execute() service = locator.GetService("service1") service.Execute() service = locator.GetService("service2") service.Execute() }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 简单工厂模式、工厂模式、抽象工厂模式的解析-iOS
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Book of CSS3
Peter Gasston / No Starch Press / 2011-5-13 / USD 34.95
CSS3 is the technology behind most of the eye-catching visuals on the Web today, but the official documentation can be dry and hard to follow. Luckily, The Book of CSS3 distills the heady technical la......一起来看看 《The Book of CSS3》 这本书的介绍吧!