Singleton設計模式介紹

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;
    } }
相關文章
相關標籤/搜索