之前看设计模式一直记不住享元模式是什么意思,为了好几我是这样子理解的,享是共享的意思,元是对象的意思,组合起来就是共享对象,即使共享池。当系统对象多的时候,对象进行共享可以减少系统的开销。共享池最好的例子还是JDBC的连接池,想想每个连接的特点,我们不难总结出:适用于作共享的一些对象,他们有一些共有的属性,就拿数据库连接池来说,url、driverClassName、username、password及dbname,这些属性对于每个连接来说都是一样的,所以就适合用享元模式来处理,建一个工厂类,将上述类似属性作为内部数据,其它的作为外部数据,在方法调用时,当做参数传进来,这样就节省了空间,减少了实例的数量。
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;
import com.mysql.jdbc.Connection;
public class ConnectionPool {
private Vector<Connection> pool;
private String url=FileUtils.getConfig("db.url");
private String name = FileUtils.getConfig("db.username");
private String password = FileUtils.getConfig("db.password");
private String driverClassName = FileUtils.getConfig("db.driver");
private int poolSize = 100;
private static ConnectionPool instance = null;
Connection conn = null;
static{
getInstance();
}
private ConnectionPool(){
pool = new Vector<Connection>(poolSize);
for(int i=0; i< poolSize;i++){
try {
Class.forName(driverClassName);
conn = (Connection) DriverManager.getConnection(url, name, password);
pool.add(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
}
}
//释放回连接池
public synchronized void release(){
pool.add(conn);
}
//返回连接池中的一个数据连接
public synchronized Connection getConnection(){
if(pool.size()<=0){
return null;
}
Connection conn = pool.get(0);
pool.remove(conn);
return conn;
}
//获得连接池实例对象
public static ConnectionPool getInstance(){
if(instance == null){
syscInit();
}
return instance;
}
//初始化连接池
private static synchronized void syscInit() {
if(instance == null){
instance = new ConnectionPool();
}
}
public static void main(String[] args) {
ConnectionPool connectionPool = ConnectionPool.getInstance();
connectionPool.getConnection();
}
}
通过连接池共享管理,不需要每次创建新连接,节省数据库连接重新创建开销,提升系统性能!