天天看點

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;

}