Singleton就是單元素設計模式,該設計模式確保了在一個運用程序中,不管合飾地,這個類就只有一個實例可用.
適用範圍.這種設計模式常常用於數據源庫鏈接池對象等方面.由於不管你是從程序中的任何部分須要訪問數據庫,都是從該鏈接池中取出一個鏈接,用完後,再將鏈接放會鏈接池中.所以僅只須要一個鏈接池實例,該實例從第一次訪問初始化,到運用程序關閉,他的生命週期才結束.
這種設計模式最大的特色是構造器設爲私有,再申明一個類型爲本身自己的靜態私有變量myself,而後編寫一個獲取該類實例的靜態公有方法(通常使用方法名爲"getInstance()",你用其餘名字也能夠,可是這是一個約定俗成的規範),在這個方法中,判斷,若是myself未被初始化,說明是第一次訪問該對象,則調用私有構造器對myself進行初始化,而後返回myself,若是myslef已經被初始化,那直接返回myself.
下面我就以編寫一個數據庫鏈接池類來具體說明一下這種設計模式.
假設你已經在你的web容器中配製好了一個名爲"jdbc/xxx"的數據源
package xxx;
import java.sql.SQLException;
import java.sql.Connection;
import javax.sql.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;
public class ConnectionPool {
private static String JDNI_NAME = "java:comp/env/jdbc/xxx";
private DataSource ds;
//申明一個類型爲本身自己的變量
[b]private static ConnectionPool mySelf;[/b]
/**
* 定義一個私有的構造器
* @param ds DataSource
*/
[b]private ConnectionPool(DataSource ds)[/b] {
this.ds = ds;
}
/**
* 獲取類實例的方法
* @return ConnectionPool
*/
[b]public static ConnectionPool getInstance() [/b]{
try {
//若是myself未被初始化過
if (mySelf == null) {
Context initCtx = new InitialContext();
if (initCtx == null) {
throw new NamingException("error.context.init");
}
DataSource ds = (DataSource) initCtx.lookup(JDNI_NAME);
//調用私有構造器對其進行實例化
[b]mySelf = new ConnectionPool(ds);[/b]
}
[b]return mySelf;[/b]
} catch (NamingException ne) {
ne.printStackTrace();
throw new RuntimeException("error.connectionpool.getinstance");
}
}
/**
* 獲取鏈接方法
* @param autoCommit boolean
* @return Connection
* @throws SQLException
*/
public Connection getConnection(boolean autoCommit) throws SQLException {
Connection con = ds.getConnection();
con.setAutoCommit(autoCommit);
return con;
} }