請教兩種Singleton Pattern 實現方式的區別!

ddna發表於2006-03-06
我這幾天看了一個採用JavaBean+JSP設計的網站,其中資料庫連線的JavaBean為DBConnection.java,還有一個用來進行記錄執行日誌的類:Debug.java,這兩個類都採用了單例模式,但是方式有不同,請教一下為什麼要這樣做呢?
DBConnection.java如下:

import java.sql.*;

/**
 * 本類用於與資料庫建立接
 */
public abstract class DBConnection{
	private static Connection conn=null;

	/**
	 * 與資料庫建立連線
	 *
	 * 返回值-Connection物件
	 */
	public static Connection getConnection(){
		try{
			if(conn == null){
				Class.forName("com.mysql.jdbc.Driver");
				conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital","root","");
				Debug.log("Connection created.");
			}

			else{
				Statement stmt=conn.createStatement();
				ResultSet rs=stmt.executeQuery("SELECT COUNT(*) FROM administrator");
				if(rs==null||!rs.next()){
					Class.forName("com.mysql.jdbc.Driver");
					conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/hospital","root","");
					Debug.log("Connection re-created.");
				}

			}
		}
		catch(Exception ex){
			Debug.log(Debug.getExceptionMsg(ex));
		}
		finally{
			return conn;
		}
	}
}
<p class="indent">

DeBug.java 如下:

import java.io.*;
import java.util.Date;
import java.text.SimpleDateFormat;

/**
 * 本類用於將網站執行時遇到的異常資訊記錄到檔案中
 */
public final class Debug{
	private static Debug instance=null;
	private static SimpleDateFormat dateFormat=null;
	private static FileOutputStream fos=null;

	private Debug(){
	}

	/**
	 * 初始化Debug物件
	 *
	 * 引數:
	 * path-日誌檔案儲存路徑
	 *
	 * 返回值-Debug單例物件
	 */
	static synchronized Debug init(String path){
		String file="";
		String fullPath="";

		if(instance == null){
			instance=new Debug();
			dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			file="" + (new SimpleDateFormat("yyyy-MM-dd"))
					.format(new Date()) + ".log";

			try{
				fullPath=path + "\\" + file;
				fos=new FileOutputStream(fullPath,true);
			}
			catch(IOException ioe){
				System.err.println("Cannot open file " + file + "," + fullPath);
			}
		}

		return instance;
	}

	/**
	 * 將資訊記入日誌檔案
	 *
	 * 引數:
	 * msg-資訊
	 */
	public static synchronized void log(String msg){
		String s2=dateFormat.format(new Date()) + " " + msg + "\n";
		if(instance != null)
			instance.writeFile(s2);
		else
			System.err.println(s2);
	}

	/**
	 * 將資訊記入日誌檔案,供log(String msg)呼叫
	 */
	private String writeFile(String msg){
		if(fos == null){
			return "Log file cannot be opened";
		}
		try{
			fos.write(msg.getBytes());
			fos.flush();
		}
		catch(IOException ex){
			return ex.getMessage();
		}
		return null;
	}

	/**
	 * 生成格式化異常資訊
	 *
	 * 引數:
	 * e-異常
	 *
	 * 返回值-格式化後的異常資訊
	 */
	public static String getExceptionMsg(Exception e){
		StackTraceElement ste=e.getStackTrace()[0];
		String msg=ste.getClassName() + "." + ste.getMethodName() + "() Ln " + ste.getLineNumber() + ":   " + e.getMessage();

		return msg;
	}
}

DBConnection使用了abstract防止被例項化,而Debug使用final,並且設定私有建構函式,二者各自實現單例模式,但為什麼要用這兩種不同方式呢??請教各位!!!

相關文章