程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計形式之單態形式(Singleton形式)引見

Java設計形式之單態形式(Singleton形式)引見

編輯:關於JAVA

Java設計形式之單態形式(Singleton形式)引見。本站提示廣大學習愛好者:(Java設計形式之單態形式(Singleton形式)引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java設計形式之單態形式(Singleton形式)引見正文


界說:Singleton形式重要感化是包管在Java運用法式中,一個類Class只要一個實例存在。

在許多操作中,好比樹立目次 數據庫銜接都須要如許的單線程操作。

還有,singleton可以或許被狀況化;如許,多個單態類在一路便可以作為一個狀況倉庫一樣向外供給辦事,好比,你要服裝論壇t.vhao.net中的帖子計數器,每次閱讀一次須要計數,單態類可否堅持住這個計數,而且能synchronize的平安主動加1,假如你要把這個數字永遠保留到數據庫,你可以在不修正單態接口的情形下便利的做到。

別的方面,Singleton也可以或許被無狀況化。供給對象性質的功效,

Singleton形式就為我們供給了如許完成的能夠。應用Singleton的利益還在於可以節儉內存,由於它限制了實例的個數,有益於Java渣滓收受接管(garbage collection)。

我們經常看到工場形式中類裝入器(class loader)中也用Singleton形式完成的,由於被裝入的類現實也屬於資本。

若何應用單例形式

普通Singleton形式平日有幾種情勢:

public class Singleton {
    private Singleton(){}
 //在本身外部界說本身一個實例,是否是很奇異?
 //留意這是private 只供外部挪用
 private static Singleton instance = new Singleton();
 //這裡供給了一個供內部拜訪本class的靜態辦法,可以直接拜訪  
 public static Singleton getInstance() {
  return instance;   
 }
}

第二種情勢:

public class Singleton {
 private static Singleton instance = null;
 public static synchronized Singleton getInstance() {
     //這個辦法比下面有所改良,不消每次都停止生成對象,只是第一次     
     //應用時生成實例,進步了效力!
     if (instance==null)
      instance=new Singleton();
  return instance;
    }
}

應用Singleton.getInstance()可以拜訪單態類。

下面第二中情勢是lazy initialization,也就是說第一次挪用時初始Singleton,今後就不消再生成了。

留意到lazy initialization情勢中的synchronized,這個synchronized很主要,假如沒有synchronized,那末應用getInstance()是有能夠獲得多個Singleton實例。關於lazy initialization的Singleton有許多觸及double-checked locking (DCL)的評論辯論,有興致者進一步研討。

普通以為第一種情勢要加倍平安些。

應用單例形式留意事項

有時在某些情形下,應用Singleton其實不能到達Singleton的目標,若有多個Singleton對象同時被分歧的類裝入器裝載;在EJB如許的散布式體系中應用也要留意這類情形,由於EJB是跨辦事器,跨JVM的。

我們以SUN公司的寵物店源碼(Pet Store 1.3.1)的ServiceLocator為例略微剖析一下:

在Pet Store中ServiceLocator有兩種,一個是EJB目次下;一個是WEB目次下,我們檢討這兩個ServiceLocator會發明內容差不多,都是供給EJB的查詢定位辦事,可是為何要離開呢?細心研討對這兩種ServiceLocator才發明差別:在WEB中的ServiceLocator的采用Singleton形式,ServiceLocator屬於資本定位,天經地義應當應用Singleton形式。然則在EJB中,Singleton形式曾經掉去感化,所以ServiceLocator才分紅兩種,一種面向WEB辦事的,一種是面向EJB辦事的。

Singleton形式看起來簡略,應用辦法也很便利,然則真正用好,長短常不輕易,須要對Java的類 線程 內存等概念有相當的懂得。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved