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

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4271 | 回復(fù): 8
打印 上一主題 下一主題

Singleton 模式 在 Java 中的應(yīng)用 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2002-09-04 10:53 |只看該作者 |倒序?yàn)g覽
[這個(gè)貼子最后由cinc在 2002/09/05 04:07pm 編輯]

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

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

以往的做法,是在程序的某個(gè)類里面(比如是 GlobalObject )建立一個(gè)這個(gè)此種類的實(shí)例,然后規(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ǎn):
  其他人可能 調(diào)用 ConnectionPoolManager 的構(gòu)造函數(shù)自己建立一個(gè) 數(shù)據(jù)庫連接池,導(dǎo)致
  程序中存在多個(gè) ConnectionPoolManager,人為的規(guī)定往往得不到好的實(shí)施。
  GlobalObject 其實(shí)就是一個(gè) C 語言中的全局變量,與面向?qū)ο蟮姆椒ㄏ鄾_突。



因此,可以使用 設(shè)計(jì)模式 中的 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 是私有的,開始時(shí)賦值為 null,外部只有通過 getInstance 方法才能獲得他。
2.構(gòu)造方法是私有的,這點(diǎn)很重要,保證只有這個(gè)類自己才能夠調(diào)用,其他的類無法調(diào)用此構(gòu)造函數(shù)。
3.getInstance 方法中:
   if 語句,保證只有一個(gè) instance 存在
   唯一的一個(gè) ConnectionPoolManager 在第一次調(diào)用的時(shí)候被建立。


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

參考:
  設(shè)計(jì)模式:可復(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/

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2002-09-04 10:58 |只看該作者

Singleton 模式 在 Java 中的應(yīng)用

斑竹你的程序有點(diǎn)問題,定義的時(shí)候應(yīng)當(dāng)定義成靜態(tài)的,否則沒法判斷是否已經(jīng)存在!
不過,還是一個(gè)很好的帖子,建議加為精品

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2002-09-04 10:59 |只看該作者

Singleton 模式 在 Java 中的應(yīng)用

呵呵,看錯(cuò)了,沒錯(cuò)!

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2002-09-04 11:06 |只看該作者

Singleton 模式 在 Java 中的應(yīng)用

mygod , 你說的是哪個(gè)要定義成 靜態(tài) 的啊,能說的具體點(diǎn)嗎?呵呵

我剛看了 Runtime 的實(shí)現(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() {}
}

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2002-09-04 11:07 |只看該作者

Singleton 模式 在 Java 中的應(yīng)用

呵呵,那就好。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2002-09-05 15:56 |只看該作者

Singleton 模式 在 Java 中的應(yīng)用

[這個(gè)貼子最后由cinc在 2002/09/05 04:08pm 編輯]

上面有個(gè)錯(cuò)誤,是關(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;  
  }  

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

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

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

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

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

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

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

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2002-09-10 11:54 |只看該作者

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 高效編程指南》

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

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2002-09-10 12:07 |只看該作者

Singleton 模式 在 Java 中的應(yīng)用

這個(gè)類的目的:只有一個(gè)實(shí)例,不允許使用構(gòu)造方法。

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

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

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

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


:)

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2002-09-10 12:49 |只看該作者

Singleton 模式 在 Java 中的應(yīng)用

非常詳細(xì),謝謝!
看來自己的基礎(chǔ)太不扎實(shí)了。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP