Singleton设计模式简单介绍

王朝other·作者佚名  2008-05-31
宽屏版  字体: |||超大  

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;

//申明一个类型为自己本身的变量

private static ConnectionPool mySelf;

/**

* 定义一个私有的构造器

* @param ds DataSource

*/

private ConnectionPool(DataSource ds) {

this.ds = ds;

}

/**

* 获取类实例的方法

* @return ConnectionPool

*/

public static ConnectionPool getInstance() {

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);

//调用私有构造器对其进行实例化

mySelf = new ConnectionPool(ds);

}

return mySelf;

} 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;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有