享元模式十分容易理解,说白了就是“共用对象”,何谓共用对象呢?比如大家都需要使用一个共同的数据,那就为这个共同的数据专门创建一个对象,然后大家都去调用该对象就行了,而没必要为每个调用者都创建这样一个对象。
那为何要共用对象呢?众所周知,创建一个对象所需要的“花费”是十分高的,所以能少创建就少创建。
比如数据库连接所需要花费的系统消耗非常大,用户操作一次数据库就要接连一次数据库的话,浪费的时间就太多了。这时候“数据库连接池”这个东西出现了,数据库连接池就是用的享元模式,数据库连接池的大概思想是:一次性地创建N条数据库连接存到连接池里,然后在用户需要使用连接时,就返回一条空闲连接给用户,并将返回的连接标志为“忙”,若些时没有“空闲”的连接了,那系统就会再创建一些连接到连接池里供用户使用,在用户使用完连接后,会释放连接,即把该连接重新标志为“空闲”,以便下次使用。
下面是数据库连接池实现的简单例子,只实现了简单的数据库连接对象的创建和存到连接池,以及返回空闲连接给用户这两个功能。其它功能并没有实现
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* 连接管理器
* @author Administrator
*
*/
class ConnectionManager
{
// 定义一个线程池
private List<Connection> connections = new ArrayList<Connection>();
// 用户要连接时,获取的线程池的索引号
private int gettingConn = 0;
/**
* 从连接池中返回一条连接
* @param url
* @param userName
* @param password
* @return
*/
public Connection getConnection(String url, String userName, String password)
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
//初始化线程池
if (0 == connections.size())
{
for (int i = 0; i < 50; i++)
{
Connection conn = DriverManager.getConnection(url,
userName, password);
connections.add(conn);
}
}
// 返回连接池中的线程
return connections.get(gettingConn++);
} catch (ClassNotFoundException e)
{
e.printStackTrace();
} catch (SQLException e)
{
e.printStackTrace();
}
return null;
}
}