歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java中兩種單例模式小結

概念:

保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

以前我們的做法是設置一個全局變量,也就是讓它使得一個對象被訪問。但是它不能防止你實例多個對象。這時我們可以讓類自身負責保存它的唯一實例,這個類可以保證沒有其他實例可以被創建,並且提供一個訪問該實例的方法。

通過上面的描述,我們可以看到單例模式有以下特點:

  1、單例類只能有一個實例。

  2、單例類必須自己自己創建自己的唯一實例。

  3、單例類必須給所有其他對象提供這一實例。

因此,創建一個類的實例的具體方法(要素)是:

1、 私有的、靜態的成員變量

2、 私有的構造方法

3、 公共的、靜態的一個入口方法

根據上面的具體方法,我們來看一下下面的代碼

public class Test {
 private static Test instance = new Test (); 
 
 private Test (){
 
 }
 
 public static Test GetInstance(){
  return instance;
 }
}

從上面的代碼中我們看出,當類加載到內存時,在我們調用GetInstance()方法之前,就已經在內存中創建了一個instance對象。也就是說,不管我是否想用這個方法,在內存中就已經存在instance這個對象了,此時這個對象就是多余對象了,這樣就會占用內存資源。因此我們將這種單例模式稱作“餓漢式”單例模式。其實就是一個“預加載”的過程。

而“懶漢式”單例模式(也就是“延遲式”創建對象)則是在我們需要的時候才去創建這個對象。這樣就避免了提前創建對象占用內存資源。

public class Test {
 private static Test instance = null;
 
 private Test (){
 
 }
 public static Test getInstance(){
  if (instance == null) then {
   instance = new Test ();
  }
  return instance;
 }
}

但是,通過觀察上面的代碼,我們可以看出其中還是存在一些問題的。假設,有多個進程同時調用getInstance()方法,這樣就可能出現同時創建多個對象,那這就不是單例模式了。因此,我們可以加入“同步”這個關鍵字使得我們的代碼更加的嚴謹。改進之後是這樣的

public class Test {
 private static Test instance = null;
 
 private Test (){
 
 }
 public static synchronized Test getInstance(){
  if (instance == null) then {
   instance = new Test ();
  }
  return instance;
 }
}

Copyright © Linux教程網 All Rights Reserved