- 論壇徽章:
- 0
|
Java Singleton 模式用來保證在運行的應(yīng)用程序中,一個Class只是實例化一次,也就是只有一個相應(yīng)的對象存在。在 web 程序中我們會用一個核心的分配功能的Servlet程序,在這里我們就可以運用這種設(shè)計模式了。
一般Singleton模式通常有幾種種形式:
第一種形式:
定義一個類,它的構(gòu)造函數(shù)為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調(diào)用其中的方法。
public class Singleton {
private Singleton(){}
//在自己內(nèi)部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內(nèi)部調(diào)用
private static Singleton instance = new Singleton();
//這里提供了一個供外部訪問本class的靜態(tài)方法,可以直接訪問
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
//使用時生成實例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
例子:
/**
* 數(shù)據(jù)庫連接管理類
*/
public class DBManager {
private static Logger logger = Logger.getLogger(DBManager.class);
/**
* 本靜態(tài)變量用來存放本系統(tǒng)啟動時由Struts生成的連接池的數(shù)據(jù)源
*/
private static DataSource datasource;
/**
* 由于本類使用單態(tài)設(shè)計模式,因此不允許在使用中通過New進行實例化,那么本類就要提供一個 此類的實例供外界使用,這就是供外界使用的實例
*/
private static DBManager dbConManager = new DBManager();//類被加載時構(gòu)建實例
private DBManager() {
}
/**
* 此靜態(tài)方法用來向類的靜態(tài)變量賦值,用來在系統(tǒng)中使用
*
* @param mydatasource
* 傳入的struts生成的數(shù)據(jù)源
*/
public void setDatasource(DataSource mydatasource) {
logger.info("設(shè)置數(shù)據(jù)源");
if (datasource == null) {
datasource = mydatasource;
}
}
/**
* 由于本類使用單態(tài)模式,不允許其他的類使用New進行創(chuàng)建實例 因此在這里提供一個共有的靜態(tài)方法來向外界提供自己的一個實例。
*
* @return 返回本類的唯一實例
*/
public static DBManager getInstance() {
logger.info("獲得數(shù)據(jù)庫連接管理類的實例");
return dbConManager;
}
/**
* 此方法提供一個可用的數(shù)據(jù)庫連接,從連接池中取得可用連接
*
* @return 可用的數(shù)據(jù)庫連接
* @throws java.lang.SQLException
* 有可能要拋出的SQL異常
*/
public Connection getConnection() throws SQLException {
Connection conn = null;
try {
logger.info("從連接池中獲得空閑的數(shù)據(jù)庫連接");
conn = datasource.getConnection();
return conn;
} catch (SQLException ex) {
logger.error("DBManager.getConnection(獲取數(shù)據(jù)庫連接失敗):[SQLException]"
+ ex.getMessage());
throw ex;
}
}
/**
* 這是一個用來關(guān)閉所有的數(shù)據(jù)庫連接相關(guān)的打開對象的方法,這樣作的好處是不用在每一次調(diào)用了sql之后 要寫一大串的關(guān)閉操作。
*
* @param conn
* 將要關(guān)閉的數(shù)據(jù)庫連接
* @param st
* 將要關(guān)閉的數(shù)據(jù)庫操作對象
* @param pst
* 將要關(guān)閉的預(yù)處理數(shù)據(jù)庫操作對象
* @param cst
* 將要關(guān)閉的數(shù)據(jù)庫存儲過程調(diào)用對象
* @param rst
* 將要關(guān)閉的數(shù)據(jù)庫記錄集對象
* @throws java.lang.Exception
* 有可能要拋出的異常
*/
public void closeAll(Connection conn, Statement st, PreparedStatement pst,
CallableStatement cst, ResultSet rst) throws DBManagerException {
try {
if (rst != null) {
rst.close();
}
if (st != null) {
st.close();
}
if (pst != null) {
pst.close();
}
if (cst != null) {
cst.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
throw new DBManagerException("數(shù)據(jù)庫對象關(guān)閉出錯!"+e.getMessage(),e);
}
}
}
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/67175/showart_2143393.html |
|