亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用 [打印本頁]

作者: cinc    時間: 2002-09-04 10:53
標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用
[這個貼子最后由cinc在 2002/09/05 04:07pm 編輯]

Singleton 模式在 Java 中的應(yīng)用
作者 cinc 2002-09-04

程序中經(jīng)常有這樣的要求,整個程序運行時只有一個實例被使用。
比如:數(shù)據(jù)庫連接池,系統(tǒng)參數(shù)配置,Java API 中的 Runtime, Calendar ...
如何實現(xiàn)這種需求成為一個值得討論的問題。

以往的做法,是在程序的某個類里面(比如是 GlobalObject )建立一個這個此種類的實例,然后規(guī)定
所有需要用到此類的,都從 GlobalObject 那里獲得,看下面的例子:

public class ConnectionPoolManager {
    public ConnectionPoolManager {
        // do some initialize work
    }
    public Connection getConnection(){
        ....
    }
}

public class GlobalObject {
    private ConnectionPoolManager connectionPoolManager&#59;
    public GlobalObject () {
        connectionPoolManager = new ConnectionPoolManager()&#59;
        ...
    }
    public void getConnectionPoolManager() {
        return connectionPoolManager&#59;
    }
}

public class QueryFunctions {
    public static Collection findStudentByName(String name){
        ConnectionPoolManager = globalObject.getConnectionPoolManager()&#59;
        Connection connection = connectionPoolManager.getConnection()&#59;
        // query database
    }
}

但這樣做有如下缺點:
  其他人可能 調(diào)用 ConnectionPoolManager 的構(gòu)造函數(shù)自己建立一個 數(shù)據(jù)庫連接池,導(dǎo)致
  程序中存在多個 ConnectionPoolManager,人為的規(guī)定往往得不到好的實施。
  GlobalObject 其實就是一個 C 語言中的全局變量,與面向?qū)ο蟮姆椒ㄏ鄾_突。



因此,可以使用 設(shè)計模式 中的 Singleton (單件)模式來完成以上的需求:
Java API 中的 Runtime 等等用的就是這種方法。
代碼如下:

public class ConnectionPoolManager {
    private static instance = null&#59;
    private ConnectionPoolManager() {
        // do some initialize work
    }
    public static syncronized void getInstance() {
        if (instance == null){
            instance = new ConnectionPoolManager()&#59;
        }
        return instance&#59;
    }
    public Connection getConnection(){
    }
}

ConnectionPoolManager 的使用

public class QueryFunctions {
    public static Collection findStudentByName(String name){
        ConnectPoolManager connectionPoolManager = ConnectionPoolManager.getInstance()&#59;
        Connection conn = connectionPoolManager.getConnection()&#59;
        // query database
    }
}

1.instance 是私有的,開始時賦值為 null,外部只有通過 getInstance 方法才能獲得他。
2.構(gòu)造方法是私有的,這點很重要,保證只有這個類自己才能夠調(diào)用,其他的類無法調(diào)用此構(gòu)造函數(shù)。
3.getInstance 方法中:
   if 語句,保證只有一個 instance 存在
   唯一的一個 ConnectionPoolManager 在第一次調(diào)用的時候被建立。


Java語言在設(shè)計的時候就使用了很多 設(shè)計模式的思想,像 Collection 中的 Iterator 模式,
Event 中的 Observer 模式,Applet 中的 Templete 模式,對象創(chuàng)建時的 Factory 模式,這些
模式大多可以從 Java 的類的命名中體現(xiàn)出來,希望大家在學(xué)習(xí) Java 時多注意對 設(shè)計模式 的學(xué)習(xí)。

參考:
  設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ) (Gang of Four 的 Design Pattern 經(jīng)典)
  Thinking in Pattern :  http://www.mindview.net/Books/TIPatterns/ 還是 Bruce Eckel 寫的。
  Design Pattern Java : ftp://cinc.dns2go.com/pub/doc/pattern/java/


作者: mygod    時間: 2002-09-04 10:58
標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用
斑竹你的程序有點問題,定義的時候應(yīng)當(dāng)定義成靜態(tài)的,否則沒法判斷是否已經(jīng)存在!
不過,還是一個很好的帖子,建議加為精品
作者: mygod    時間: 2002-09-04 10:59
標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用
呵呵,看錯了,沒錯!
作者: cinc    時間: 2002-09-04 11:06
標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用
mygod , 你說的是哪個要定義成 靜態(tài) 的啊,能說的具體點嗎?呵呵

我剛看了 Runtime 的實現(xiàn)如下:

public class Runtime {
    private static Runtime currentRuntime = new Runtime()&#59;
    public static Runtime getRuntime() {
return currentRuntime&#59;
    }
    /** Don't let anyone else instantiate this class */
    // 夠狠
    private Runtime() {}
}


作者: cinc    時間: 2002-09-04 11:07
標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用
呵呵,那就好。
作者: cinc    時間: 2002-09-05 15:56
標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用
[這個貼子最后由cinc在 2002/09/05 04:08pm 編輯]

上面有個錯誤,是關(guān)于同步的,上面的帖子我已經(jīng)修改過樂,下面是原來的代碼:

public class MySingleton {  
  private static  MySingleton _instance&#59;  

  public static MySingleton getInstance() {  
    if (_instance==null) {  
      _instance = new MySingleton()&#59;  
    }  
    return _instance&#59;  
  }  

對于這種 惰性初始化,initial on first demand.
由于創(chuàng)建 _instance 的過程不是原子操作,在 _instance 完全初始化之前,可能會有被
其他的線程讀取,從而得到一個沒有完全初始化的對象,造成災(zāi)難性的后果。

解決方法是把
  public static MySingleton getInstance() {  
修改成
  public static syncronized MySingleton getInstance() {  
在對象創(chuàng)建過程時 不允許其他線程訪問 _instance

但 Java 推薦的方法是放棄這種 惰性初始化,而使用如下的方法:
這樣也減少了同步的開銷,也去除了每次對 _instance 的檢查。

public class MySingleton {  
  private static  MySingleton _instance = new MySingleton()&#59;  

  private MySingleton() {  
    // construct object . . .  
  }  

  public static MySingleton getInstance() {  
    return _instance&#59;  
  }  

參考:《Java 高效編程指南》。


作者: victorachc    時間: 2002-09-10 11:54
標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用
public class MySingleton {  
private static  MySingleton _instance = new MySingleton()&#59;  

private MySingleton() {  
   // construct object . . .  
}  

public static MySingleton getInstance() {  
   return _instance&#59;  
}  

參考:《Java 高效編程指南》

請問:
類中用靜態(tài)實例作為屬性,是什么意思,想不明白,請版主詳細(xì)解釋一下,謝謝!

作者: cinc    時間: 2002-09-10 12:07
標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用
這個類的目的:只有一個實例,不允許使用構(gòu)造方法。

所以從類的外部看:沒有構(gòu)造方法的。
也就是:無法通過 new MySingleton() ...來獲取這個類的一個實例:
MySingleton toUse = new MySingleton() // error。

所以獲取這個類實例的方法 getInstance() 必須是靜態(tài)的,這樣才能從類(而不是實例)的方法獲取他的實例:
這是正確的使用方法:

MySingleton toUse = MySingleton.getInstance()&#59;

為了在 靜態(tài)方法 getInstance() 中訪問 _instance,所以 _instance 必須是 靜態(tài)的屬性。


:)
作者: victorachc    時間: 2002-09-10 12:49
標(biāo)題: Singleton 模式 在 Java 中的應(yīng)用
非常詳細(xì),謝謝!
看來自己的基礎(chǔ)太不扎實了。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2