程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深刻解析Java的設計形式編程中單例形式的應用

深刻解析Java的設計形式編程中單例形式的應用

編輯:關於JAVA

深刻解析Java的設計形式編程中單例形式的應用。本站提示廣大學習愛好者:(深刻解析Java的設計形式編程中單例形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析Java的設計形式編程中單例形式的應用正文


界說:確保一個類只要一個實例,並且自行實例化並向全部體系供給這個實例。
類型:創立類形式
類圖:

類圖常識點:
1.類圖分為三部門,順次是類名、屬性、辦法
2.以<<開首和以>>開頭的為正文信息
3.潤飾符+代表public,-代表private,#代表protected,甚麼都沒有代表包可見。
4.帶下劃線的屬性或辦法代表是靜態的。
5.對類圖中對象的關系不熟習的同伙可以參考文章:設計形式中類的關系。
單例形式應當是23種設計形式中最簡略的一種形式了。它有以下幾個要素:

  • 公有的結構辦法
  • 指向本身實例的公有靜態援用
  • 以本身實例為前往值的靜態的私有的辦法

來看一個簡略的例子:

package com.wolf.action;
import java.util.HashMap;
import java.util.Map;
public class demo {
 public static void main(String args[]) throws InstantiationException,
  IllegalAccessException, ClassNotFoundException {
 System.out.println(Son.getInstance().getName());
 System.out.println("我是誰");
 }
}
class Son extends Father {
 private String name = "兒子";
 final String CLASS = "demo";
 protected String getName() {
 return this.query("aaa");
 }
 public static Son getInstance() throws InstantiationException,
  IllegalAccessException, ClassNotFoundException {
 // 這裡必需是全局途徑 不然沒法找到
 return (Son) instance("com.wolf.action.Son");
 }
}
class Father {
 private static Map<String, Object> instance = new HashMap<String, Object>();
 private String name = "父類";
 protected void Fatcher() {
 System.out.println("我是父類");
 }
 protected String query(String sql) {
 return sql + "has been done";
 }
 public static Object instance(String objname)
  throws InstantiationException, IllegalAccessException,
  ClassNotFoundException {
 if (instance.get(objname) == null
  || !(instance.get(objname) instanceof Father)) {
  instance.put(objname, Class.forName(objname).newInstance());
 }
 return instance.get(objname);
 }
}

        單例形式依據實例化對象機會的分歧分為兩種:一種是餓漢式單例,一種是懶漢式單例。餓漢式單例在單例類被加載時刻,就實例化一個對象交給本身的援用;而懶漢式在挪用獲得實例辦法的時刻才會實例化對象。代碼以下:
餓漢式單例

public class Singleton { 
  private static Singleton singleton = new Singleton(); 
  private Singleton(){} 
  public static Singleton getInstance(){ 
    return singleton; 
  } 
} 

懶漢式單例

public class Singleton { 
  private static Singleton singleton; 
  private Singleton(){} 
   
  public static synchronized Singleton getInstance(){ 
    if(singleton==null){ 
      singleton = new Singleton(); 
    } 
    return singleton; 
  } 
} 

單例形式的長處:

  • 在內存中只要一個對象,節儉內存空間。
  • 防止頻仍的創立燒毀對象,可以進步機能。
  • 防止對同享資本的多重占用。
  • 可以全局拜訪。

實用場景:因為單例形式的以上長處,所所以編程頂用的比擬多的一種設計形式。我總結了一下我所曉得的合適應用單例形式的場景:

  • 須要頻仍實例化然後燒毀的對象。
  • 創立對象時耗時過量或許耗資本過量,但又常常用到的對象。
  • 有狀況的對象類對象。
  • 頻仍拜訪數據庫或文件的對象。
  • 和其他我沒用過的一切請求只要一個對象的場景。

單例形式留意事項:

  • 只能應用單例類供給的辦法獲得單例對象,不要應用反射,不然將會實例化一個新對象。
  • 不要做斷開單例類對象與類中靜態援用的風險操作。
  • 多線程應用單例應用同享資本時,留意線程平安成績。

關於java中單例形式的一些爭議:

單例形式的對象長時光不消會被jvm渣滓搜集器搜集嗎
        看到很多材料中說:假如一個單例對象在內存中久長不消,會被jvm以為是一個渣滓,在履行渣滓搜集的時刻會被清算失落。對此這個說法,筆者持疑惑立場,筆者自己的不雅點是:在hotspot虛擬機1.6版本中,除非工資地斷開單例中靜態援用到單例對象的聯接,不然jvm渣滓搜集器是不會收受接管單例對象的。
關於這個爭議,筆者零丁寫了一篇文章停止評論辯論,假如您有分歧的不雅點或許有過這方面的閱歷請進入文章單例形式評論辯論篇:單例形式與渣滓搜集介入評論辯論。
 
在一個jvm中會湧現多個單例嗎
        在散布式體系、多個類加載器、和序列化的的情形下,會發生多個單例,這一點是毋庸置疑的。那末在統一個jvm中,會不會發生單例呢?應用單例供給的getInstance()辦法只能獲得統一個單例,除非是應用反射方法,將會獲得新的單例。代碼以下

Class c = Class.forName(Singleton.class.getName()); 
Constructor ct = c.getDeclaredConstructor(); 
ct.setAccessible(true); 
Singleton singleton = (Singleton)ct.newInstance(); 

如許,每次運轉都邑發生新的單例對象。所以應用單例形式時,必定留意不要應用反射發生新的單例對象。
 
懶漢式單例線程平安嗎
        重要是網上的一些說法,懶漢式的單例形式是線程不平安的,即便是在實例化對象的辦法上加synchronized症結字,也仍然是風險的,然則筆者經由編碼測試,發明加synchronized症結字潤飾後,固然對機能有部門影響,然則倒是線程平安的,其實不會發生實例化多個對象的情形。
 
單例形式只要餓漢式和懶漢式兩種嗎
        餓漢式單例和懶漢式單例只是兩種比擬主流和經常使用的單例形式辦法,從實際上講,任何可以完成一個類只要一個實例的設計形式,都可以稱為單例形式。
 
單例類可以被繼續嗎
        餓漢式單例和懶漢式單例因為結構辦法是private的,所以他們都是弗成繼續的,然則其他許多單例形式是可以繼續的,例如掛號式單例。
 
餓漢式單例好照樣懶漢式單例好
        在java中,餓漢式單例要優於懶漢式單例。C++中則普通應用懶漢式單例。
單例形式比擬簡略,在此就不舉例代碼演示了。

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