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

Singleton在Java中的應用

編輯:關於JAVA

 了解本文的例子

  編者按:程序中經常有這樣的要求,整個程序運行時只有一個實例被使用。比如:數據庫連接池,系統參數配置,Java API 中的 Runtime, Calendar ...如何實現這種需求成為一個值得討論的問題。讓我們來看看本文的例子。

   

  A.常見的例子

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

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

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

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

  但這樣做有如下缺點:

  其他人可能 調用 ConnectionPoolManager 的構造函數自己建立一個 數據庫連接池,導致程序中存在多個 ConnectionPoolManager,人為的規定往往得不到好的實施。

  GlobalObject 其實就是一個 C 語言中的全局變量,與面向對象的方法相沖突。

  

           

新的方法實踐過程

  B.使用新的方法

  因此,可以使用 設計模式 中的 Singleton (單件)模式來完成以上的需求:

  Java API 中的 Runtime 等等用的就是這種方法。

  代碼如下:

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

  ConnectionPoolManager 的使用

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

  1.instance 是私有的,開始時賦值為 null,外部只有通過 getInstance 方法才能獲得他。
  2.構造方法是私有的,這點很重要,保證只有這個類自己才能夠調用,其他的類無法調用此構造函數。
  3.getInstance 方法中:if 語句,保證只有一個 instance 存在

  唯一的一個 ConnectionPoolManager 在第一次調用的時候被建立。

  

           

實例和參考

  C.另一個特殊實例

  下面是另一個例子: Java.lang.Runtime

  我剛看了 Runtime 的實現如下:

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

  它在定義變量時創建 唯一的 Runtime 實例。

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

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