設(shè)計(jì)模式之服務(wù)定位器模式

簡介

服務(wù)定位器模式(Service Locator Pattern)用在我們想使用 JNDI 查詢定位各種服務(wù)的時(shí)候雇卷÷蠊浚考慮到為某個(gè)服務(wù)查找 JNDI 的代價(jià)很高卢肃,服務(wù)定位器模式充分利用了緩存技術(shù)幻锁。在首次請求某個(gè)服務(wù)時(shí)敞映,服務(wù)定位器在 JNDI 中查找服務(wù),并緩存該服務(wù)對象糕珊。當(dāng)再次請求相同的服務(wù)時(shí)动分,服務(wù)定位器會在它的緩存中查找,這樣可以在很大程度上提高應(yīng)用程序的性能红选。以下是這種設(shè)計(jì)模式的實(shí)體澜公。

  • 服務(wù)(Service) - 實(shí)際處理請求的服務(wù)。對這種服務(wù)的引用可以在 JNDI 服務(wù)器中查找到喇肋。
  • Context / 初始的 Context - JNDI Context 帶有對要查找的服務(wù)的引用玛瘸。
  • 服務(wù)定位器(Service Locator) - 服務(wù)定位器是通過 JNDI 查找和緩存服務(wù)來獲取服務(wù)的單點(diǎn)接觸。
  • 緩存(Cache) - 緩存存儲服務(wù)的引用苟蹈,以便復(fù)用它們糊渊。
  • 客戶端(Client) - Client 是通過 ServiceLocator 調(diào)用服務(wù)的對象。

實(shí)現(xiàn)

創(chuàng)建 ServiceLocator慧脱、InitialContext渺绒、Cache、Service 作為表示實(shí)體的各種對象菱鸥。Service1 和 Service2 表示實(shí)體服務(wù)宗兼。演示類ServiceLocatorPatternDemo在這里是作為一個(gè)客戶端,將使用 ServiceLocator 來演示服務(wù)定位器設(shè)計(jì)模式氮采。


服務(wù)定位器模式

代碼實(shí)現(xiàn)

//創(chuàng)建服務(wù)接口 Service殷绍。
//Service.java
public interface Service {
   public String getName();
   public void execute();
}
//創(chuàng)建實(shí)體服務(wù)。
//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";
   }
}
//為 JNDI 查詢創(chuàng)建 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;      
   }
}
//創(chuàng)建緩存 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);
      }
   }
}
//創(chuàng)建服務(wù)定位器。
//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;
   }
}
//使用 ServiceLocator 來演示服務(wù)定位器設(shè)計(jì)模式躯概。
//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();      
   }
}
//執(zhí)行程序登钥,輸出結(jié)果:

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市娶靡,隨后出現(xiàn)的幾起案子牧牢,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塔鳍,死亡現(xiàn)場離奇詭異伯铣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)轮纫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門腔寡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜡感,你說我怎么就攤上這事蹬蚁∈牙幔” “怎么了郑兴?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贝乎。 經(jīng)常有香客問我情连,道長,這世上最難降的妖魔是什么览效? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任却舀,我火速辦了婚禮,結(jié)果婚禮上锤灿,老公的妹妹穿的比我還像新娘挽拔。我一直安慰自己,他們只是感情好但校,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布螃诅。 她就那樣靜靜地躺著,像睡著了一般状囱。 火紅的嫁衣襯著肌膚如雪术裸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天亭枷,我揣著相機(jī)與錄音袭艺,去河邊找鬼。 笑死叨粘,一個(gè)胖子當(dāng)著我的面吹牛猾编,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播升敲,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼袍镀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了冻晤?” 一聲冷哼從身側(cè)響起苇羡,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后设江,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锦茁,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年叉存,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了码俩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歼捏,死狀恐怖稿存,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞳秽,我是刑警寧澤瓣履,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站练俐,受9級特大地震影響袖迎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腺晾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一燕锥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悯蝉,春花似錦归形、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗡靡,卻和暖如春跺撼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讨彼。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工歉井, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哈误。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓哩至,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜜自。 傳聞我的和親對象是個(gè)殘疾皇子菩貌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 服務(wù)定位器模式(Service Locator Pattern)用在我們想使用 JNDI 查詢定位各種服務(wù)的時(shí)候。...
    _凌浩雨閱讀 1,552評論 0 2
  • 前言: 因?yàn)楝F(xiàn)在設(shè)計(jì)模式在網(wǎng)絡(luò)上已經(jīng)泛濫,但是還是有好多程序員不能夠靈活的運(yùn)用設(shè)計(jì)模式,這個(gè)是對設(shè)計(jì)模式簡單的介紹...
    蝸牛ICU閱讀 720評論 0 3
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,096評論 1 32
  • 以下內(nèi)容是我用來溫習(xí)的,從以下兩個(gè)博客總結(jié)而來,請關(guān)注原作者ref:Service Locator 模式設(shè)計(jì)模式【...
    richy_閱讀 2,255評論 1 1
  • Java服務(wù)定位器模式 當(dāng)我們想要使用JNDI查找來定位各種服務(wù)時(shí)仇参,使用服務(wù)定位器設(shè)計(jì)模式嘹叫。 考慮到為服務(wù)查找JN...
    木易林1閱讀 512評論 0 0